P2182

翻硬币

题目描述

小Z离开家的时候忘记带走了钱包,掉下的硬币在桌子上排成了一列。正在等着哥哥回来的小D坐在桌子旁边,无聊地翻着桌子上的硬币。

出于某种爱好,小D一次一定会同时翻转 M 枚硬币。由于小D是一个爱动脑的小学生,这样进行了若干次之后她很快想到了一个问题:有多少种方法能够在 K 次翻转后把硬币由原来的状态变成现在这样呢?

因为小D是个好学的小学生,她只需要你告诉她方案数对 1000000007 取模的值以方便她进行验算就可以了。

输入格式

第一行,包含三个字符 N,K,M ,表示硬币的数量,翻转的次数和每次翻转的硬币数量。

第 2~3 行,包含 N 个字母,表示硬币在一开始的状态和最终要变成的状态。1 表示正面而 0 表示背面。

输出格式

一行包含一个整数,表示方案数对 1000000007 取模的值。

样例 #1

样例输入 #1

3 2 1
100
001

样例输出 #1

2

提示

【样例解释】

100→101→001

100→000→001

【数据规模】

对于 30% 的数据,N ≤ 4,0 ≤ K ≤ 5;

对于 60% 的数据,N ≤ 10;

对于 100% 的数据,1 ≤ N ≤ 100,0 ≤ K ≤ 100,0 ≤ M ≤ N 。

神仙DP
完全没想到状态表示以及转移方程
分析:硬币的位置不重要 重要的是正反面状态以及与最终序列不一样的数目 
f[i][j]:已经翻了i次 当前状态和最终状态有j个位置不一样的方案数
枚举每次选的m枚的状态有多少枚与结束状态不同
有p个不同 m-p个相同 翻转后 p个相同 m-p个不同
那么f[i-1][?]的基础上 多了+(m-p)-p=m-2p个不同的 
f[i][j+(m-2p)]+=f[i-1][j]  ? 
END?并没有 可以发现有很多种组合方式都表示成了一个f[][]状态
所以我们还要乘上选出p个不同 m-p个相同的方案数 即C(j,p)*C(n-j,m-p)
所以我们预处理出C[][]数组 DP转移即可
还有 C[][]初始化不要写挂…… WTM…… C[i][0]=1(i:0(!!!)~n)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7; 
int n,k,m,f[105][105];
int C[105][105];
//f[i][j]:已经翻了i次 当前状态和最终状态有j个位置不一样的方案数
//硬币的位置不重要 重要的是正反面状态以及与最终序列不一样的数目 
string s1,s2;
signed main()
{
	ios::sync_with_stdio(false);
	cin>>n>>k>>m;	
	cin>>s1>>s2;
	s1=" "+s1,s2=" "+s2;
	int dif=0;
	for(int i=1;i<=n;i++)dif+=(s1[i]!=s2[i]);
	//枚举每次选的m枚的状态有多少枚与结束状态不同
	//有p个不同 m-p个相同 翻转后 p个相同 m-p个不同
	//那么f[i-1][?]的基础上 多了+(m-p)-p=m-2p个不同的 
	//f[i][j+(m-2p)]+=f[i-1][j]  ? 
	//END?并没有 可以发现有很多种组合方式都表示成了一个f[][]状态
	//所以我们还要乘上选出p个不同 m-p个相同的方案数 即C(j,p)*C(n-j,m-p)
	//所以我们预处理出C[][]数组 DP转移即可
	for(int i=0;i<=n;i++)C[i][0]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
	for(int i=1;i<=n;i++)C[i][i]=1;
	f[0][dif]=1;
	for(int i=1;i<=k;i++)
		for(int j=0;j<=n;j++)
			for(int p=0;p<=m;p++)
				if(j+(m-2*p)>=0&&j+(m-2*p)<=n)
				{
					f[i][j+(m-2*p)]=(f[i][j+(m-2*p)]%mod+f[i-1][j]%mod*C[j][p]%mod*C[n-j][m-p]%mod);
					f[i][j+(m-2*p)]=(f[i][j+(m-2*p)]%mod+mod)%mod;
				}
	cout<<f[k][0]<<"\n";
	return 0;
}
posted @ 2023-01-26 18:09  PKU_IMCOMING  阅读(24)  评论(0)    收藏  举报