DP 杭电女生赛07题 Combine String

来源:互联网 发布:淘宝卖家虚拟电话 编辑:程序博客网 时间:2024/05/22 04:51
本来是打算贪心水一发,然后发现如果出现第一个和第二个序列中出现同样元素的情况的时候是会造成误判的,也可以递归的算法,但是应该会TLE。所以就用dp!dp真是个好算法dp[i][j]=(dp[i-1][j]&&a[i]==c[i+j])||(dp[i][j-1]&&b[j]==c[i+j]);
是状态转移方程,
但是在i=0或者j=0的时候要特判一下防止re;
i和j意思是取第一个序列的第i个,取第二个序列的第j个
#include<bits/stdc++.h>    using namespace std;char  a[2005];char  b[2005];char  c[2005];int dp[2005][2005];int main(){    int i;    while(~scanf("%s",a+1)){        scanf("%s",b+1);        scanf("%s",c+1);        memset(dp,0,sizeof(dp));        dp[0][0]=1;        if(strlen(a+1)+strlen(b+1)!=strlen(c+1)){            printf("No\n");            continue;        }        for(int i=0;i<=strlen(a+1);i++){            for(int j=0;j<=strlen(b+1);j++){                if(i==0&&j==0){                    continue;                }                if(i==0){                    dp[i][j]=(dp[i][j-1]&&b[j]==c[i+j]);                }                else if(j==0){                    dp[i][j]=(dp[i-1][j]&&a[i]==c[i+j]);                }                else{                    dp[i][j]=(dp[i-1][j]&&a[i]==c[i+j])||(dp[i][j-1]&&b[j]==c[i+j]);                }            }        }        if(dp[strlen(a+1)][strlen(b+1)])            printf("Yes\n");        else            printf("No\n");    }    return 0;}


0 0
原创粉丝点击