bzoj3304 [Shoi2005]带限制的最长公共子序列
dp,时间复杂度O(n^3),f[i][j][k]表示a串到i,b串到j的时候,匹配了c串的k位,要用滚动数组
代码
1 #include<cstring> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 const int N = 510; 6 char a[N],b[N],c[N]; 7 int l1,l2,l3,i,j,k,f[N][N][2],now; 8 int main() 9 { 10 scanf("%s",a); 11 scanf("%s",b); 12 scanf("%s",c); 13 l1=strlen(a); 14 l2=strlen(b); 15 l3=strlen(c); 16 for (k=0;k<=l3;k++) 17 { 18 now=1-now; 19 for (i=0;i<=l1;i++) 20 for (j=0;j<=l2;j++) 21 if (i+j+k) 22 { 23 f[i][j][now]=-0x37373737; 24 if (i) f[i][j][now]=max(f[i][j][now],f[i-1][j][now]); 25 if (j) f[i][j][now]=max(f[i][j][now],f[i][j-1][now]); 26 if (i&&j) 27 if (a[i-1]==b[j-1]) 28 { 29 f[i][j][now]=max(f[i][j][now],f[i-1][j-1][now]+1); 30 if (k) 31 if (a[i-1]==c[k-1]) 32 f[i][j][now]=max(f[i][j][now],f[i-1][j-1][now^1]+1); 33 } 34 } 35 } 36 if (f[l1][l2][now]<0) 37 printf("NO SOLUTION"); 38 else 39 printf("%d\n",f[l1][l2][now]); 40 }