DP经典应用(二)最长递增子序列问题
2017-04-06 19:11
218 查看
最长递增子序列问题
问题描述:有一个数组长为n,请求出这个序列中最长的递增子序列的长度。( 递增子序列:对于任意的i < j 都满足ai < aj的子序列 )样例输入:
5
4 2 3 1 5
样例输出:
3
分析:
按照解决动态规划的前3个步骤我们进行分析:1.刻画一个最优解的结构特征:
定义dp[i]为以ai为末尾元素的最长递增子序列的长度。
比如根据样例输入,dp[0]=1。
2.递归地定义最优解的值:
以ai为末尾元素的子序列是:
1.只包含ai的子序列
2.如果满足j < i 并且 aj < ai这个条件的以aj为末尾的子序列末尾再加上ai后得到的新子序列。这两者之一。
所以得到此递推式:
dp[i] = max(dp[i],dp[j]+1) (j < i 且 aj < ai)
3.计算最优解的值,采用自底向上的递推法。
则代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10000+10; int dp[maxn]; int main() { int n; scanf("%d",&n); while(n--) { char a[maxn]; scanf("%s",a); for(int i=0;i<strlen(a);i++) { dp[i] = 1; for(int j=0;j<=i;j++) { if(a[j]<a[i]) { dp[i] = max(dp[i],dp[j]+1); } } } int max=0; for(int i=0;i<strlen(a);i++) { if(max<dp[i]) max = dp[i]; } printf("%d\n",max); } return 0; }
注:这个经典问题经常被设计改编成其他题目,比如导弹发射高度问题,它是求最最长递减子序列问题,并没有什么区别,只是判断条件换了一下而已。
所以掌握此问题是非常重要的。
相关文章推荐
- DP经典应用(四)二维最长上升子序列问题——矩形嵌套问题
- dp经典之最长递增子序列长度问题
- leetcode 300. Longest Increasing Subsequence 最长递增子序列LISS + 十分经典的动态规划DP做法
- [转]最长递增子序列问题的求解
- 求最长递增子序列问题
- 最长递增子序列问题
- TOJ--1765:Longest Ordered Subsequence (DP求最长递增子序列)
- 动态规划-最长递增子序列/最长公共子序列/01背包问题
- dp之最长递增、公共子序列总结
- hdu 1087(DP经典最大递增子序列)
- 求数组中最长递增子序列问题
- ACM 79. 渡轮问题(最长不下降子序列dp)
- 最长递增子序列问题
- 最长递增子序列问题
- HDU 3998 Sequence(经典问题,最长上升子序列)
- [转]最长递增子序列问题的求解
- 网络流 6最长递增子序列问题
- HDU1423(最长递增公共子序列+DP)
- LIS&LCS最长递增子序列和最长公共子序列问题
- 动态规划之最长递增子序列问题详解