题目链接
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; }
时间: 2024-10-10 16:39:53