总结---最大上升子序列(O(n²)解法)
2013-03-23 20:52
267 查看
最大上升子序列问题是指一序列求其子递增序列的最大长度
解决此问题的思想是动态规划,用数组记录下以每个数字为子序列尾情况的上升序列数,再找出最大值即可。
解决此问题的思想是动态规划,用数组记录下以每个数字为子序列尾情况的上升序列数,再找出最大值即可。
#include<iostream> #include<string> using namespace std; int main() { int list[1000],n; int dp[1000],i,j,max; while(cin>>n) { max=0; for(i=0;i<n;i++) { cin>>list[i]; dp[i]=1; //每个作为子序列尾的数字自身长度为1 } for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(dp[j]+1>dp[i] && list[i]>list[j]) dp[i]=dp[i]+1; } if(max<dp[i]) max=dp[i]; //找出各上升子序列的最大长度 } cout<<max<<endl; } }
if(dp[j]+1>dp[i] && list[i]>list[j]) 主要解释一下这句话:
这句话作为状态转移的条件 list[i]>list[j]很显然:如果list[j]>list[i]的话那么该序列不为递增序列因次要list[i]>list[j]
而dp[j]+1>dp[i]保证了整个子序列为上升序列
比如:序列9 8 9 10
此时i=3;即list[3]=10;
当j=1时;list[1]=8;
list[3]>list[1];而list[1]<list[0]显然满足条件;
但因为当i=1时,list[1]并未发生状态转移dp[1]仍然等于1;由于j=0,i=3时发生了状态转移dp[3]=2;
dp[1]+1=dp[3]不满足dp[j]+1>dp[i]因此同样不会发生状态转移
相关文章推荐
- 最长上升或下降子序列解法 总结
- 求最大连续子序列的和,两种解法:动态规划 & Kadane算法
- 标题:最大子序列和的几种解法(总结)
- 用O(nlogn)的算法实现最大上升子序列(LIS)输出.
- 最大子序列求和问题(1)-解法之一分治法
- hdu 1003 最大最长上升子序列 贪心
- hdu 1160 FatMouse's Speed(最大上升子序列+路径输出)
- POJ 1631 Bridging signals(最长上升子序列 n*logn && POJ 3903)
- HDU 1087(动态规划-最大上升序列)
- hdu 1025 Constructing Roads In JGShining's Kingdom 最长上升序列
- 最大上升子序列的和
- 算法题2 动态规划之最大子序列和&amp;最大子矩阵和
- ZOJ 1108 FatMouse's Speed【DP】【最大上升子序列】
- hdu 1160 FatMouse's Speed(最大上升子序列dp)
- hdoj_1231&&hdoj_1003最大连续子序列
- BZOJ1046:上升序列(LIS & dp)
- 编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
- 最大上升子序列-python
- scu oj 4441 Necklace(dp+树状数组求上升序列最大和)
- 算是第一个抄的DP 最大上升(下降)子序列