题目链接
https://icpcarchive.ecs.baylor.edu/external/68/6801.pdf
借下队友的代码。
#include<iostream>
#include<cstdio>
#include<cstring>
unsigned long long dp[1010][1010];
bool flag[1010][1010];
char a[1010];
using namespace std;
int main()
{
int T;
cin>>T;
int t=1;
while(T--)
{
unsigned long long n,k;
cin>>n>>k;
int cnt=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]=='1')
{
cnt++;
}
}
memset(dp,0,sizeof(dp));
memset(dp,false,sizeof(flag));
dp[0][cnt]=1;
flag[0][cnt]=true;
if(k<cnt||(cnt-k)%2)
{
cout<<"Case #"<<t++<<": "<<0<<endl;
}
else
{
for(int i=1;i<=k;i++)
{
for(int j=0;j<=n;j++)
{
if(flag[i-1][j])
{
if(j+1<=n)
{
dp[i][j+1]=(dp[i-1][j]*(n-j)%1000000007+dp[i][j+1])%1000000007;
flag[i][j+1]=true;
}
if(j-1>=0)
{
dp[i][j-1]=(dp[i-1][j]*j%1000000007+dp[i][j-1])%1000000007;
flag[i][j-1]=true;
}
}
}
}
cout<<"Case #"<<t++<<": "<<dp[k][0]<<endl;
}
}
return 0;
}
原文:http://blog.csdn.net/qq_18738333/article/details/45236871