题意:
给三个字符串,判断前两个在相对顺序不变的情况下是否可以组成第三个字符串。
思路:
先说屌丝:
dp[i][j]代表1串的前i个和2串的前j个字符在3串的前i+j个字符中最多能够组合出几个字符。
然后状态转移是:
如果stra[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i-1][j]+1)
同样的若strb[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i][j-1]+1)
最后判断dp[lena][lenb]是否等于lena+lenb
再说大神思路:
大神直接把dp定义成bool型,初始化dp[0][0]=1;
然后dp[i]][j]=dp[i-1][j]&&tmpa[i]==tmpc[i+j]||dp[i][j-1]&&tmpb[j]==tmpc[i+j]
屌丝代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[205][205]; int main() { int t; scanf("%d",&t); char tmpa[205],tmpb[205],tmpc[505]; for(int tt=1; tt<=t; tt++) { memset(dp,0,sizeof(dp)); scanf("%s%s%s",tmpa+1,tmpb+1,tmpc+1); int lena=strlen(tmpa+1); int lenb=strlen(tmpb+1); int lenc=strlen(tmpc+1); if(lena+lenb!=lenc) { printf("Data set %d: no ",tt); } else { for(int i=0; i<=lena; i++) { for(int j=0; j<=lenb; j++) { if(i!=0) { if(tmpa[i]==tmpc[i+j]) { dp[i][j]=dp[i-1][j]+1; } else { dp[i][j]=dp[i-1][j]; } } if(j!=0) { if(tmpb[j]==tmpc[i+j]) { dp[i][j]=max(dp[i][j],dp[i][j-1]+1); } else { dp[i][j]=max(dp[i][j],dp[i][j-1]); } } } } /*for(int i=0;i<=lena;i++) { for(int j=0;j<=lenb;j++) { printf("%d ",dp[i][j]); } puts(""); }*/ if(dp[lena][lenb]==lenc) { printf("Data set %d: yes ",tt); } else { printf("Data set %d: no ",tt); } } } }