vimer linux kernel 爱好者

hdu 1159

2014-07-14

分析

很简单的一道动态规划,而且没有打印路径 我的思路也是来自《算法导论》,但是看了一个台湾朋友的博客才算是明白了一点点。 他是这么想的,将两个字符串各取最后一个的e1,e2,这样原字符串可以表示为sub1+e1,sub2+e2,

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char X[1000];
char Y[1000];
int C[1000][1000];
int LCS(char* X,char* Y,int m,int n)
{
	for(int i=1;i<=m;i++)
		C[i][0]=0;
	for(int i=0;i<=n;i++)
		C[0][i]=0;
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
		{
			if(X[i-1]==Y[j-1])
				C[i][j]=C[i-1][j-1]+1;
			else if(C[i-1][j]>=C[i][j-1])
				C[i][j]=C[i-1][j];
			else
				C[i][j]=C[i][j-1];
		}
	return C[m][n];


}
int main()
{
	freopen("in.txt","r",stdin);
	while(cin>>X>>Y){
		int m=strlen(X);
		int n=strlen(Y);
		int ans=LCS(X,Y,m,n);
		printf("%d\n",ans);

		memset(X,0,sizeof(X));
		memset(Y,0,sizeof(Y));
		memset(C,0,sizeof(C));
	}
}

后来再补充!


下一篇 计划

Comments

Content