动态规划专练4 最长上升子序列
2017-12-25 22:10
246 查看
问题描述
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
思路:以dp[i]表示以a[i]元素结尾的子序列(其中a[i]>a[j]且i>j)的最大长度,则dp[i]有两种情况:dp[j]+1大还是dp[i]原来就大,一直保持最大长度即可。
——————————————————————————————————————————————————————————————————————————
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
思路:以dp[i]表示以a[i]元素结尾的子序列(其中a[i]>a[j]且i>j)的最大长度,则dp[i]有两种情况:dp[j]+1大还是dp[i]原来就大,一直保持最大长度即可。
——————————————————————————————————————————————————————————————————————————
#include <stdio.h> int input[1000];//输入串 int dp[1000];//保存每一个元素的最大子序列长度 int main() { int n; while(scanf("%d",&n)!=EOF) { int i,j; for(i=0;i<n;i++) { scanf("%d",&input[i]); dp[i]=1;//更新最小为一 } int max=0; for(i=0;i<n;i++)//外层循环n个元素 { for(j=0;j<i;j++)//内层枚举该元素以前的元素长度(子序列) { if(input[i]>input[j]) dp[i]=dp[i]>dp[j]+1?dp[i]:dp[j]+1;//保持最大长度(如2534176 1后面的7对于1是不更新的,因为dp[4]+1<dp[5](也就是7),所以这里要判断,保持最大!!) } max=max>dp[i]?max:dp[i];//更新最大值 } printf("%d\n",max); } return 0; }
相关文章推荐
- 动态规划 最长公共子序列 最长上升子序列 最长上升公共子序列
- 070day(动态规划思路,例题(最长上升子序列)和流操纵算子)
- 动态规划之一最长上升子序列LIS
- 动态规划之最长上升子序列
- 动态规划_最长上升子序列LIS
- 动态规划之最大公共序列+最长上升子序列
- nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)
- 动态规划练习--01(最长上升子序列)
- 动态规划—最长公共上升子序列
- 动态规划(最长上升子序列)
- poj 1836 (动态规划之最长上升子序列)
- 动态规划 最长上升子序列
- 初识动态规划-最长不上升子序列
- 动态规划之编号动态规划:hdu 1025(dp+二分 求最长上升子序列)
- 动态规划:最长上升子序列
- 动态规划-最长上升子序列(LIS)
- 动态规划----求最长上升子序列
- 动态规划2-最长上升子序列(算法基础 第5周)
- J - FatMouse's Speed HDU 1160 (动态规划,最长上升子序列+路径输出)
- 动态规划:最长上升子序列