动态规划:NOI 2009 管道取珠

[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一下就解决了。

 

posted @ 2016-07-22 16:44  TenderRun  阅读(220)  评论(0编辑  收藏  举报