HDU 1501 高效!
阿新 • • 發佈:2018-12-31
DP解法:
最優子結構分析:如上例,如果A、B可以組成C,那麼,C最後一個字母e,必定是 A 或 C 的最後一個字母組成。
C去除除最後一位,就變成是否可以求出 A-1和B 或者 A與B-1 與 是否可以構成 C-1。。。
狀態轉移方程: 用f[i][j] 表示 表示A前 i 為 和B 前j 位是否可以組成 C的前i+j位
dp[i][j]= (dp[i-1][j]&&(a[i]==c[i+j]))||(dp[i][j-1]&&(b[j]==c[i+j]))
#include<stdio.h> #include<string.h> char a[201],b[201],c[402]; int la,lb,lc; int dp[201][201]; int main() { int ncase; scanf("%d",&ncase); for(int n=1; n<=ncase; n++) { a[0]='p'; b[0]='p'; c[0]='p'; scanf("%s%s%s",a+1,b+1,c+1); la=strlen(a); lb=strlen(b); lc=strlen(c); la-=1; lb-=1; //處理邊界 for (int i=1; i<=la; i++) if (a[i]==c[i]) dp[i][0]=1; for (int i=1; i<=lb; i++) if (b[i]==c[i]) dp[0][i]=1; //DP for (int i=1; i<=la; i++) for (int j=1; j<=lb; j++) dp[i][j]= (dp[i-1][j]&&(a[i]==c[i+j]))||(dp[i][j-1]&&(b[j]==c[i+j])); printf("Data set %d: ",n); if (dp[la][lb]==1) printf("yes\n"); else printf("no\n"); } return 0; }