题目大意:求两个字符串的最大公共子序列有多长
思路:动态规划问题,主要是找到变化的核心式子。
if(z1[i-1]==z2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;}
else dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
相等的时候就是斜上方的连续数+1
不然就是上方或者左方的最大值
D A B C 3 1 2
0 0 0 0 0 0 0 0
A 0 0 1 1 1 1 1 1
B 0 0 1 2 2 2 2 2
C 0 0 1 2 3 3 3 3
1 0 0 1 2 3 3 4 4
2 0 0 1 2 3 3 4 5
3 0 0 1 2 3 4 4 5
最后计算出的值就是5
#include<stdio.h>
#include<string.h>
char z1[1005];
char z2[1005];
int dp[1005][1005];
int main(void)
{
while(scanf("%s%s",&z1,&z2)!=EOF){
int i,j;
int n=strlen(z1);
int m=strlen(z2);
for(i=0;i<=m;i++) dp[0][i]=0;//初始化很重要
for(i=0;i<=n;i++) dp[i][0]=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(z1[i-1]==z2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
else dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
本文介绍了一种使用动态规划解决最长公共子序列问题的方法,通过对比两个字符串逐字符匹配来构建解决方案矩阵。
150

被折叠的 条评论
为什么被折叠?



