自己尝试了几次,需要注意几点:
1.数组不能太小:
2.需要注意DP所用二维数组和输入一维数组对应关系。
下面是AC的代码,仅供参考
#include <stdio.h>
#include <string.h>
#define MAX 500
void LCSLength(int m, int n, char x[], char y[],int c[][MAX])
{
int i, j;
#include <string.h>
#define MAX 500
void LCSLength(int m, int n, char x[], char y[],int c[][MAX])
{
int i, j;
c[0][0]=0;
for(i = 1; i <= m; i++) c[i][0] = 0; //第一列置0
for(i = 0; i <= n; i++) c[0][i] = 0; //第一行置0
for(i = 1; i <= m; i++)
for(j = 1; j<=n; j++)
{
if(x[i-1]==y[j-1])
{
c[i][j] = c[i-1][j-1] + 1; //所比较字符相等就取二维数组的左上角元素+1
}else if(c[i-1][j]>=c[i][j-1]){
c[i][j] = c[i-1][j]> c[i][j-1]?c[i-1][j]: c[i][j-1]; //否则取左边和上面较大的数
}
printf("%d\n", c[m-1][n-1]);
}
int main()
{
char s1[MAX];
char s2[MAX];
int c[MAX][MAX];
int len1, len2 ;
while(scanf("%s %s", s1, s2) !=EOF)
{
len1= strlen(s1);
len2= strlen(s2);
LCSLength(len1+1,len2+1, s1, s2, c);
}
return 0;
}
for(i = 1; i <= m; i++) c[i][0] = 0; //第一列置0
for(i = 0; i <= n; i++) c[0][i] = 0; //第一行置0
for(i = 1; i <= m; i++)
for(j = 1; j<=n; j++)
{
if(x[i-1]==y[j-1])
{
c[i][j] = c[i-1][j-1] + 1; //所比较字符相等就取二维数组的左上角元素+1
}else if(c[i-1][j]>=c[i][j-1]){
c[i][j] = c[i-1][j]> c[i][j-1]?c[i-1][j]: c[i][j-1]; //否则取左边和上面较大的数
}
printf("%d\n", c[m-1][n-1]);
}
int main()
{
char s1[MAX];
char s2[MAX];
int c[MAX][MAX];
int len1, len2 ;
while(scanf("%s %s", s1, s2) !=EOF)
{
len1= strlen(s1);
len2= strlen(s2);
LCSLength(len1+1,len2+1, s1, s2, c);
}
return 0;
}