您的位置:首页 > 其它

BestCoder Round #47 1003

2015-07-12 11:46 381 查看
solution : 就按题解敲了一遍,好久没写这种dp

1 #include <cstdio>
2 #include <cstring>
3 #include <string>
4 #include <vector>
5 #include <algorithm>
6 #include <iostream>
7 using namespace std;
8 typedef long long LL;
9 const int MAX = 1e3+10;
const int MOD = 1e9+7;
int dp[MAX][MAX];
LL f[MAX][MAX];
int Next[30];
char a[MAX],b[MAX];
int main() {
int cas;
scanf("%d",&cas);
while(cas--) {
scanf("%s %s",a+1,b+1);
memset(dp,0,sizeof(dp));
int n=strlen(a+1);
int m=strlen(b+1);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(a[i]==b[j]) {
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
}
else {
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
}
}
memset(f,0,sizeof(f));
for(int i=0;i<=n;i++) {
memset(Next,0,sizeof(Next));
for(int j=0;j<=m;j++) {
if(dp[i][j]==0) {
f[i][j]=1;
}
else {
Next[b[j]-'a']=j;
if(dp[i-1][j]==dp[i][j]) {
f[i][j]=(f[i][j]+f[i-1][j])%MOD;
}
if(Next[a[i]-'a']) {
int p=Next[a[i]-'a'];
if(p&&dp[i-1][p-1]+1==dp[i][j]) {
f[i][j]=(f[i][j]+f[i-1][p-1])%MOD;
}
}
}
}
}
cout<<f
[m]<<endl;
}56 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: