Common Subsequence(dp)HDU 1159

来源:互联网 发布:阿里云深圳机房ip地址 编辑:程序博客网 时间:2024/05/29 19:11

题目大意:求两个字符串的最大公共子序列有多长

思路:动态规划问题,主要是找到变化的核心式子。

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;}


0 0
原创粉丝点击