动态规划POJ2533最长上升子序列与POJ1458最长公共子序列
- 动态规划: 将一个问题分解成若干个子问题,类似于递归,但是每一个子问题的最优解都是基于上一个子问题的最优解的基础之上,可以用递归实现,但是在实现的过程中,会造成多次运算前面已经算好的最优解,增加不必要的计算,复杂度大。
1、POJ2533最长上升子序列
样例:
7
1 7 3 5 9 4 8
输出 :4
思路:maxlen[i]数组存放以data[i]为结尾的最长上升序列的长度。maxlen[0]=1。
i从1开始到len-1,j从0开始到i-1,如果data[i]>data[j],那么temp存储maxlen[j]+1;如果temp大于当前的maxlen[i],那么更新。
[code]#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int data[1010]; int maxlen[1010]; int main() { int n; scanf("%d",&n); int i,j,temp; for( i=0; i<n; i++) scanf("%d",&data[i]); maxlen[0]=1; for(i=1; i<n; i++) { temp=1; for(j=0; j<i; j++) { if(data[i]>data[j]) { temp=maxlen[j]+1; } if(temp>maxlen[i]) maxlen[i]=temp; } } temp=0; for(int i=0; i<n; i++) if(temp<maxlen[i]) temp=maxlen[i]; printf("%d\n",temp); return 0; }
2、最长公共子序列
输入
abcfbc abfcab
programming contest
abcd mnpabcfbc
输出
4
0
2
maxlen[i][j]表示s1前i个字符组成的串s1i和s2前j个字符组成的字符串的最长公共序列的长度,i从1开始到n,嵌套j从1到i,求出maxlen[i][j],如果s1[i]==s2[j],那么maxlen[i][j]=max[i-1][j];如果不等那么maxlen[i][j]=max( maxlen[i-1][j] max[i][j-1] )
如果不等那么maxlen[i][j]=max( maxlen[i-1][j] max[i][j-1] )这里证明:
假设 maxlen[i][j]>max( maxlen[i-1][j] max[i][j-1] ), 那么说明s1[i]==s2[j],跟前提矛盾
假设maxlen[i][j]<max( maxlen[i-1][j] max[i][j-1] ) ,由于s1[i]在s1[i-1]后面,s2 [j]在s2[j-1]后面,说明s1[i],s2[j]处公共子序列长度大于等于max( maxlen[i-1][j] max[i][j-1] )
[code]#include <iostream> #include <cstdio> #include <cstring> using namespace std; char s1[210],s2[210]; int maxlen[210][210]; int main() { int temp; while(scanf("%s %s",s1+1,s2+1)!=EOF) { int len1=strlen(s1+1),len2=strlen(s2+1); for(int i=0; i<=len1; i++) maxlen[i][0]=0; for(int j=0; j<=len2; j++) maxlen[0][j]=0; for(int i=1; i<=len1; i++) for(int j=1; j<=len2; j++) { if(s1[i]==s2[j]) maxlen[i][j]=maxlen[i-1][j-1]+1; else { temp= maxlen[i-1][j]>maxlen[i][j-1]?maxlen[i-1][j]:maxlen[i][j-1]; maxlen[i][j]=temp; } } printf("%d\n",maxlen[len1][len2]); } return 0; }
铁柱铁柱 原创文章 8获赞 0访问量 229 关注 私信
- 动态规划 POJ - 1458 Common Subsequence(最长公共子序列)
- 两道基础动态规划poj1458最长公共子序列和poj2533最长上升序列
- POJ 1458 Common Subsequence(最长公共子序列)__动态规划
- poj 1458 动态规划解最长公共子序列问题
- 【郭炜老师】【动态规划】3.最长公共子序列CLS(POJ 1458)
- POJ 1458(最长公共子序列 动态规划) 解题报告
- POJ 1458(最长公共子序列 动态规划) 解题报告
- POJ 1458/HDU 1159 最长公共子序列 (动态规划)
- poj1458最长公共子序列(动态规划)
- POJ-2533-Longest Ordered Subsequence-最长递增子序列-动态规划
- POJ 1458 Common Subsequence(最长公共子序列问题)
- poj1458(DP最长连续公共子序列)
- poj 1458(最长公共子序列)
- Common Subsequence poj-1458 动态规划
- 最普通 最长公共子序列 POJ 1458 一次AC
- poj-1458 最长公共子序列
- 最长公共子序列(LCS, Longest Common Subsequence), POJ 1458
- poj1458 求最长公共子序列 经典DP
- 简单dp的@poj(1)POJ 1458 最长公共子序列
- (三) POJ1050,动态规划必做题目,经典程度五颗星。这个题目的前身就是:求最大子序列和。 先来看最大子序列和。有一串数,有正有负,如2,-1,5,4,-9,7,0,3,-5。求:这