1. 程式人生 > >HDU 1501 高效!

HDU 1501 高效!

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;
}