动态规划-最长上升子序列
来源:互联网 发布:和讯黄金软件 编辑:程序博客网 时间:2024/06/05 05:18
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
71 7 3 5 9 4 8
样例输出
4
如何把这个问题分解成子问题呢?经过分析,发现“求以ak(k=1,2, 3…N)为终点的最长上升子序列的长度”是个好的子问题。
由上所述的子问题只和一个变量相关,就是数字的位置。因此序列中数的位置k就是“状态”,而状态k对应的“值”,就是以ak做为“终点”的最长上升子序列的长度。这个问题的状态一共有N个。状态定义出来后,转移方程就不难想了。
假定MaxLen (k)表示以ak 做为“终点”的最长上升子序列的长度,那么:
MaxLen (1) = 1
MaxLen (k) = Max { MaxLen (i):1<i < k 且 ai < ak 且 k≠1 } + 1
实际实现的时候,可以不必编写递归函数,因为从 MaxLen(1)就能推算出MaxLen(2),有了MaxLen(1)和MaxLen(2)就能推算出MaxLen(3)……
下面是我的ac代码:
#include<iostream>using namespace std;int main(){ int i,j,N; cin>>N; int b[N+1],aMaxLen[N+1]; for(i=1;i<=N;i++) { cin>>b[i]; } aMaxLen[1]=1; for(i=2;i<=N;i++) {//求以第i个数为终点的最长上升子序列的长度
int nTmp=0;//记录第i个数左边子序列最大长度 for(j=1;j<i;j++) {//搜索以第i个数左边数为终点的最长上升子序列长度
if(b[i]>b[j]) { if(nTmp<aMaxLen[j])nTmp=aMaxLen[j]; } } aMaxLen[i]=nTmp+1; } int nMax=-1; for(i=1;i<=N;i++) { if(nMax<aMaxLen[i])nMax=aMaxLen[i]; } cout<<nMax; return 0;}
0 0
- 动态规划:最长上升子序列
- 动态规划-最长上升子序列LIS
- 动态规划求最长上升子序列
- 【算法】动态规划 最长上升子序列
- 动态规划:最长上升子序列
- poj2533 动态规划+最长上升子序列
- POJ2533 动态规划 (最长上升子序列)
- 动态规划--最长上升子序列
- 动态规划-最长上升子序列【LIS】
- 动态规划之最长上升子序列
- 动态规划 LIS最长上升子序列
- 动态规划-最长上升子序列
- 动态规划:求最长上升子序列
- 动态规划-最长上升子序列
- 动态规划(最长上升子序列)
- 动态规划:最长上升子序列
- 【动态规划】 之 最长上升子序列
- 【原创】【动态规划】最长上升子序列
- 数塔 (简单dp
- 右下角出现“测试模式 win7 内部版本7601”如何去掉?
- 操作系统作业调度和低级调度算法>>计算题
- 实现整数转成字符串
- 华为面试题——最高分是多少
- 动态规划-最长上升子序列
- 自定义图可以放大和缩小
- POJ1088滑雪(dp)
- css3 动画之transition,animation
- 无题 (配音乐)
- Linux ubuntu 14.04 环境下Qt creator中添加OpenCv2.4.9
- 内部类
- listView进行CheckBox的全选、反选
- 基本寄存器简介