标签:amp ted 并且 lock main std code define blog
又被“if(a=b)”坑了QAQ。。。写C++还是得开Warning,这么久了pascal还没改过来咋回事啊QWQ
题目大意就不说了OWO
网上的题解都不怎么看得懂啊。。。好像写得都很乱?还是我太sb了
f[i][j][k][0]表示A串前i个字符和B串前j个字符能够匹配,并且分成k段,a[i]不选。f[i][j][k][1]同理但a[i]要选。
于是。。。f[i][j][k][0]=f[i-1][j][k][1]+f[i-1][j][k][0];
if(a[i]==b[j])f[i][j][k][1]=f[i-1][j-1][k-1][0]+f[i-1][j-1][k][1]+f[i-1][j-1][k-1][1];
①第一维滚动②取模太慢了,学习CZL使用“x>=mod?x-mod:x”的小妓巧。
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #define mod 1000000007 using namespace std; char a[1010],b[510]; int n,m,K,cnt,ans,f[2][1010][210][2]; int main() { scanf("%d%d%d",&n,&m,&K); scanf("%s",a+1);scanf("%s",b+1); for(int i=1;i<=n;i++) { f[i&1][1][1][0]=cnt; if(a[i]==b[1])f[i&1][1][1][1]=1,cnt++; for(int j=2;j<=m;j++) for(int k=1;k<=K;k++) { int x=f[(i+1)&1][j][k][1]+f[(i+1)&1][j][k][0]; f[i&1][j][k][0]=x>=mod?x-mod:x; if(a[i]==b[j]) { int x=f[(i+1)&1][j-1][k][1]+f[(i+1)&1][j-1][k-1][1]; int y=x>=mod?x-mod:x; f[i&1][j][k][1]=y+f[(i+1)&1][j-1][k-1][0]>=mod?y+f[(i+1)&1][j-1][k-1][0]-mod:y+f[(i+1)&1][j-1][k-1][0]; } } for(int j=1;j<=m;j++) for(int k=1;k<=K;k++) f[(i+1)&1][j][k][1]=f[(i+1)&1][j][k][0]=0; } ans=f[n&1][m][K][1]+f[n&1][m][K][0]; printf("%d\n",ans>=mod?ans-mod:ans); }
标签:amp ted 并且 lock main std code define blog
原文地址:http://www.cnblogs.com/Sakits/p/6502660.html