最长非降/下降子序列问题(DP)(待续...)
2014-08-07 00:27
393 查看
注意:抽象成以下描述即为最长非降/下降子序列问题(一维状态)
问题描述:在一个无序的序列a1,a2,a3,a4…an里,找到一个最长的序列满足:(不要求连续)
ai<=aj<=ak…<=am,且i<j<k…<m.(最长非降子序列)
或 ai>aj>ak…>am,且i<j<k…<m.(最长下降子序列)。
问题分析:(以最长非降子序列为例)
考虑状态数组opt[maxn]; 其中opt[i]表示a[i]时可与之前元素构成非降子序列的最大长度;可参考模板(随个人喜好,不唯一):
for(int i = 1; i <= n; i++) { scanf("%d", &array[i][0]); array[i][1] = 1; //初始化到a[i]为止最长子序列长度为1; } for(int i = 2; i <= n; i++) { int len = 0; for(int j = 1; j < i; j++) //a[i]前的最长子序列 { if(array[j][0] >= array[i][0] && array[j][1] > len) //注意此处的判断条件 { len = array[j][1];//更新最长最序列长度 } } if(len > 0) array[i][1] = len + 1;//记录并更新a[i]处最长子序列长度 }View Code
for(int i = 1; i <= n; i++) { scanf("%d", &array[i]); opt[i] = 1; //初始化到a[i]时的最长子序列长度为1; } for(int i = 2; i <= n; i++) { int len = 0; for(int j = 1; j < i; j++)//a[i]前的子序列长度 { if(array[j] >= array[i] && opt[j] > len)//注意此处的判断条件, 若求下降子序列则只需将>=改为< { len = opt[j];//更新最长子序列长度 } } if(len > 0) opt[i] = len + 1;//a[i]时子序列长度+1 }
相关文章推荐
- 关于DP中的最长不下降序列问题分析
- 【DP】最长不下降子序列问题(二分)
- [dp] Testing the CATCHER 最长下降子序列问题
- 【DP】最长不下降子序列问题(二分)
- DP问题之最长非降子序列
- NIOP 1999 导弹问题 最长升降序子序列 DP[小思路]
- POJ 1952 BUY LOW BUY LOWER 【DP】最长降序子序列及其计数问题
- [dp]poj1088_滑雪 二维形式的最长下降子序列
- NYOJ 79 & 17 & 214 单调最长子序列问题(DP)
- POJ 1887 Testing the CATCHER 最长不下降序列(LIS)问题
- [HNOI2004]打鼹鼠&Codevs_P1256 打鼹鼠(DP+最长不下降子序列变形)
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法
- OpenJudge_P1996 登山(DP 最长不下降序列)
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化
- hrbust 哈理工OJ 2010 二等队形【dp】【最长递减子序列问题】
- 九度OJ 1131:合唱队形 (DP、最长上升下降序列)
- 分支限界法解决 二维最长下降序列问题(滑雪场问题)
- hdoj1160 FatMouse's Speed ( STL + 最长下降子序列 /DP)
- hdu1160 - FatMouse's Speed (dp 最长有序子序列问题)
- C++ 关于最长下降子序列问题