Light OJ 1420 - Subsequences forming Strings (DP)

来源:互联网 发布:剑三花太捏脸数据 编辑:程序博客网 时间:2024/06/04 20:04

解析:

设dp[i][j][k][0]为用A[1...j]和B[1...k]构成C[1...i]且最后一个字母是从A中取得的方案数。

设dp[i][j][k][0]为用A[1...j]和B[1...k]构成C[1...i]且最后一个字母是从B中取得的方案数。

状态转移方程:

 dp[i][j][k][0] = (dp[i][j-1][k][0] + (s[2][i]==s[0][j]?(i!=1?(dp[i-1][j-1][k][0]+dp[i-1][j-1][k][1]):1):0))%MOD;
 dp[i][j][k][1] = (dp[i][j][k-1][1] + (s[2][i]==s[1][k]?(i!=1?(dp[i-1][j][k-1][0]+dp[i-1][j][k-1][1]):1):0))%MOD;

[code]:

#include<cstdio>#include<cstring>using namespace std;typedef long long LL;const LL MOD = 1e9+7;char s[3][105];int n,m1,m2;LL dp[105][105][105][2];void sol(){    int i,j,k;    for(i = 1;i <= n;i++){        for(j = 0;j <= m1;j++){            for(k = 0;k <= m2;k++){                if(j) dp[i][j][k][0] = (dp[i][j-1][k][0] + (s[2][i]==s[0][j]?(i!=1?(dp[i-1][j-1][k][0]+dp[i-1][j-1][k][1]):1):0))%MOD;                if(k) dp[i][j][k][1] = (dp[i][j][k-1][1] + (s[2][i]==s[1][k]?(i!=1?(dp[i-1][j][k-1][0]+dp[i-1][j][k-1][1]):1):0))%MOD;            }        }    }    LL ans = dp[n][m1][m2][0]+dp[n][m1][m2][1];    ans = (ans%MOD+MOD)%MOD;    printf("%lld\n",ans);}int main(){    int i,j,cas;    scanf("%d",&cas);    for(int T=1;T<=cas;T++){        scanf("%s%s%s",s[0]+1,s[1]+1,s[2]+1);        m1 = strlen(s[0]+1);        m2 = strlen(s[1]+1);        n = strlen(s[2]+1);        printf("Case %d: ",T);        sol();    }    return 0;}


0 0
原创粉丝点击