DP经典应用(二)最长递增子序列问题
来源:互联网 发布:淘宝 毛毯垫 编辑:程序博客网 时间:2024/06/04 04:41
最长递增子序列问题
问题描述:有一个数组长为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;}
注:这个经典问题经常被设计改编成其他题目,比如导弹发射高度问题,它是求最最长递减子序列问题,并没有什么区别,只是判断条件换了一下而已。
所以掌握此问题是非常重要的。
0 0
- DP经典应用(二)最长递增子序列问题
- dp经典之最长递增子序列长度问题
- 经典dp最长递增子序列
- 单调递增最长子序列(经典dp)
- 经典Dp-单调递增最长子序列(经典dp)
- 最长递增子序列!!!(DP ,二分)
- 最长递增子序列(dp)
- 最长递增子序列 (dp)
- 最长递增子序列 - dp
- 最长递增子序列dp
- NYOJ - 单调递增最长子序列(经典dp)
- NY--17 -- 单调递增最长子序列 [经典DP]
- 51nod 1134 最长递增子序列 dp(经典)
- 最长递增公共子序列(二)
- DP经典应用(四)二维最长上升子序列问题——矩形嵌套问题
- 最长公共子序列问题 经典DP
- DP经典应用(三)最长公共子序列LCS问题
- 最长递增子序列问题((LIS))
- AngularJS Server
- CentOS7 安装Sublime Text 3
- easyUI(六) -- combobox实现下拉框及其值的获取
- bzoj1433 [ZJOI2009]假期的宿舍
- python anaconda安装与使用
- DP经典应用(二)最长递增子序列问题
- NCL脚本编辑器sublime text3安装攻略补充版
- 匿名函数(lambda)
- HEVC最优CU划分确定的过程
- STL面试题
- Luogu-P1025数的划分(dp)
- Image.FromStream与Image.FromFile使用区别
- Etag与HTTP缓存机制
- 【OpenCV3图像处理】OpenCV3源代码目录解析(算法模块解析 和 示例目录解析)