[NOI2009] 管道取珠
输入文件:ballb.in
输出文件:ballb.out
简单对比
时间限制:1 s 内存限制:512 MB
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxn=510; 6 const int mod=1024523; 7 char A[maxn],B[maxn]; 8 int dp[maxn][maxn][maxn]; 9 int n,m; 10 int main(){ 11 freopen("ballb.in","r",stdin); 12 freopen("ballb.out","w",stdout); 13 scanf("%d%d",&n,&m); 14 scanf("%s%s",A+1,B+1); 15 dp[0][0][0]=1; 16 for(int i=0;i<=n;i++) 17 for(int j=0;j<=m;j++) 18 for(int k=max(i+j-m,0);k<=i+j;k++){ 19 if(!i&&!j&&!k)continue; 20 int l=i+j-k; 21 if(A[i]==A[k]&&i&&k)dp[i][j][k]+=dp[i-1][j][k-1]; 22 if(A[i]==B[l]&&i&&l)dp[i][j][k]+=dp[i-1][j][k]; 23 if(B[j]==A[k]&&j&&k)dp[i][j][k]+=dp[i][j-1][k-1]; 24 if(B[j]==B[l]&&j&&l)dp[i][j][k]+=dp[i][j-1][k]; 25 dp[i][j][k]%=mod; 26 } 27 printf("%d\n",dp[n][m][n]); 28 return 0; 29 }
最开始想如果不平方,求结果不同的方案个数,发现几乎无法实现。
这里有平方,就可以这样转化:把每种方案复制一遍,然后配对,只有相同才计入答案,简单地DP一下就解决了。