您的位置:首页 > 其它

HDU 1501 Zipper(DP/记忆化搜索)

2011-07-08 23:23 288 查看
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");

}
}


a
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: