您的位置:首页 > 其它

【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)

2017-04-01 09:58 471 查看

1566: [NOI2009]管道取珠

Time Limit: 20 Sec Memory Limit: 650 MB
Submit: 1659 Solved: 971

Description

1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define Mod 1024523
8 #define Maxn 510
9
10 char s[Maxn];
11 int a[Maxn],b[Maxn],f[Maxn][Maxn][Maxn];
12
13 int main()
14 {
15     int n,m;
16     scanf("%d%d",&n,&m);
17     scanf("%s",s+1);
18     for(int i=1;i<=n;i++) a[i]=s[i]-'A';a[n+1]=10;
19     scanf("%s",s+1);
20     for(int i=1;i<=m;i++) b[i]=s[i]-'A';b[m+1]=100;
21     memset(f,0,sizeof(f));
22     f
[m]
=1;
23     for(int i=n;i>=0;i--)
24      for(int j=m;j>=0;j--)
25       for(int k=n;k>=0;k--)
26       {
27           int l=i+j-k;
28           if(l<0||l>m||(i==n&&j==m)) continue;
29           // f[i][j][k]=0;
30           if(a[i+1]==a[k+1]) f[i][j][k]=(f[i][j][k]+f[i+1][j][k+1])%Mod;
31           if(a[i+1]==b[l+1]) f[i][j][k]=(f[i][j][k]+f[i+1][j][k])%Mod;
32           if(b[j+1]==a[k+1]) f[i][j][k]=(f[i][j][k]+f[i][j+1][k+1])%Mod;
33           if(b[j+1]==b[l+1]) f[i][j][k]=(f[i][j][k]+f[i][j+1][k])%Mod;
34       }
35     printf("%d\n",f[0][0][0]);
36     return 0;
37 }


View Code

2017-04-01 09:57:53
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: