最长公共子序列 poj1458
来源:互联网 发布:陈道明 深夜食堂 知乎 编辑:程序博客网 时间:2024/05/29 07:13
这道题耗了我半天时间去弄明白,很不容易啊,不过收获还是很大,这是我接触动态规划的第二道题,第一道是那个数字三角形,那个很简单直接就理解了,动态转化方程也很容易写出来,这道题动态转化方程让我想了好长时间才理解,下面就是方程的理解
假设用数组a,b分别存放两个字符串
我用dp[i][j]表示a数组的第i项之前的子串和b数组第j项之前的字串的最长公共子序列,dp[][]初始化为零,
当a[i]=b[j],就说明dp[i][j]比前一项多了一个公共的,所以d[i][j]=d[i-1][j-1];
当两个不相等时,则说明d[i][j]与前面的最长公共子序列相等,分为两种,一种是dp[i][j-i],一种是dp[i-1][j],解释清楚些就是,a的第i-1项和b的第j项之前的公共字串或者a的第i项和b的第j-1项之前的公共字串,选择两个中最大的,画图最好理解了
下面就简单了,直接根据方程写就行了
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){char a[300],b[300];int dp[300][300];int len1,len2,i,j;while(scanf("%s%s",a,b)!=EOF){memset(dp,0,sizeof(dp));len1=strlen(a);len2=strlen(b);for(i=1;i<=len1;i++)for(j=1;j<=len2;j++){if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=dp[i-1][j]>dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];}printf("%d\n",dp[len1][len2]);}return 0;}
数组在这道题开大些就可以AC了,继续向动态规划迈进,加油!!!
- POJ1458最长公共子序列
- 最长公共子序列 poj1458
- 最长公共子序列 poj1458
- 最长公共子序列 poj1458
- poj1458最长公共子序列
- poj1458最长公共子序列
- POJ1458【最长公共子序列】
- POJ1458 最长公共子序列
- 最长公共子序列poj1458
- Poj1458——最长公共子序列
- poj1458最长公共子序列(LCS)
- POJ1458(最长公共子序列)
- poj1458(DP最长连续公共子序列)
- 最长公共子序列(poj1458)
- POJ1458 Common Subsequence 【最长公共子序列】
- poj1458(最长公共子序列dp)
- dp--poj1458最长公共子序列
- POJ1458(最长公共子序列)
- PHP Warning: ob_start() : output handler 'ob_gzhandler conflicts with 'zlib output compression'
- iphone开发之viewDidLoad
- project euler--10
- 一位acmer的竞赛心得
- iphone开发之解决viewWillAppear失效
- 最长公共子序列 poj1458
- HDU_1533 Going Home(最优匹配) 解题报告
- Android自适应屏幕方向及分辨率
- POJ 1265 Area (简单多边形求面积+pick公式)
- Vim
- c#常用控件
- c#高级控件
- mongdb入门开发必备工具(未续完)
- Window_Open详解