这是自己的第一个关于动态规划问题的求解,在同学的帮助下完成。学到很多。也很感谢他。
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;
}
浙公网安备 33010602011771号