这是自己的第一个关于动态规划问题的求解,在同学的帮助下完成。学到很多。也很感谢他。

1、gets()读入字符串时会把空格读入,但不会读回车。但这道题输入时是中间有空格的,如abc esc,所以用gets输入会出错。

2、char s[100],改用scanf(“%s”,s)输入,但注意:是从s【0】开始的,但自己刚开始认为如输入abc时是从s【1】开始的,因而后面循环中设置x【i】==y【j】是不对的,结果dp【a】【b】出问题,原因就是如此。所以要改为x【i-1】与y【j-1】比较。此外,计算字符串长度strlen()也要注意。

一种写法如之后的程序,还有一种写法是:scanf("%x%y",x+1,y+1)  a=strlen(x)-1(因为有x[0])   if(x[i]==y[i])......

3、原先我把int dp[1002][1002]放在int main里,但发现程序用问题,无法输入。因为1002*1002超过1万了,所以有。。。溢出。所以把int dp[1002][1002]放在main的外面,作为全局的就可以了。

4、从学长那里懂得了处理动态规划问题的思路:

(1)先是定义状态。如这道题中的dp[i][j]就是指x[i]、y[j]时的最长公共序列。

(2)确定递归方程或称为转移方程。即此处的在不同条件下的dp[i][j]=dp[i-1][j-1]+1、dp[i][j]=dp[i-1][j]、dp[i][j]=dp[i][j-1]。结果就是dp[a][b]算出三者的最大值即为所求解

(3)确定边界。即此处dp[i][0]=0,dp[0][j]=0

以下是写的程序:

#include<stdio.h>
#include<string.h>
int dp[1002][1002];
int main()
{
char x[1002],y[1002];
int i,j,a,b;
while(scanf("%s%s",x,y)!=EOF){
a=strlen(x);
b=strlen(y);
for(i=0;i<=a;i++)
dp[i][0]=0;
for(j=0;j<=b;j++)
dp[0][j]=0;
for(i=1;i<=a;i++)
for(j=1;j<=b;j++){
if(x[i-1]==y[j-1])
dp[i][j]=dp[i-1][j-1]+1;
if(x[i-1]!=y[j-1])
dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
}
printf("%d\n",dp[a][b]);
}
return 0;
}

posted on 2012-07-20 21:41  zhtzhl  阅读(78)  评论(0)    收藏  举报