77. 最长严格上升子序列(动态规划)
2016-03-14 19:58
260 查看
1576 最长严格上升子序列[/b]
时间限制: 1s
空间限制:
256000 KB
题目等级 :
黄金 Gold
题解
查看运行结果
题目描述 Description
给一个数组a1, a2 ...
an,找到最长的上升降子序列ab1b2<
.. bk,其中b1
输出长度即可。
输入描述 Input
Description
第一行,一个整数N。
第二行,N个整数(N < = 5000)
输出描述 Output
Description
输出K的极大值,即最长不下降子序列的长度
样例输入 Sample Input
5
9 3 6 2 7
样例输出 Sample Output
3
数据范围及提示 Data Size &
Hint
【样例解释】
最长不下降子序列为3,6,7
分类标签 Tags 点此展开
动态规划 序列型DP 最长上升序列㈡算法分析:
根据动态规划的原理,由后往前进行搜索(当然从前往后也一样)。
1·对b(n)来说,由于它是最后一个数,所以当从b(n)开始查找时,只存在长度为1的不下降序列;
2·若从b(n-1)开始查找,则存在下面的两种可能性:
①若b(n-1)则存在长度为2的不下降序列b(n-1),b(n)。
②若b(n-1)>b(n)则存在长度为1的不下降序列b(n-1)或b(n)。
3·一般若从b(i)开始,此时最长不下降序列应该按下列方法求出:
在b(i+1),b(i+2),…,b(n)中,找出一个比b(i)大的且最长的不下降序列,作为它的后继。
㈢数据结构:
为算法上的需要,定义一个整数类型二维数组b(N,3)
1·b(I,1)表示第I个数的数值本身;
2·b(I,2)表示从I位置到达N的最长不下降序列长度
㈤一般处理过程是:
①在i+1,i+2,…,n项中,找出比b[I,1]大的最长长度L以及位置K;
②若L>0,则b[I,2]:=L+1;b[I,3]:=k;
代码:
#include
using namespace
std;
#include
int
a[5001][3],n;//a[i][1]储存原数,a[i][2]储存1-i的最长上升子序列
int main()
{
scanf("%d",&n);
for(int
i=1;i<=n;++i)
{
scanf("%d",&a[i][1]);
a[i][2]=1;//把初始序列长度设为1
}
for(int
i=1;i<=n;++i)
{
int
maxx=1;//注意
for(int j=1;j
{
if(a[j][1]maxx)
{
maxx=a[j][2]+1;
}
}
a[i][2]=maxx;
}
int lon=0;
for(int
i=1;i<=n;++i)
{
if(a[i][2]>lon)//找出最长长度
lon=a[i][2];
}
cout<<lon<<endl;
return 0;
}
相关文章推荐
- 查看linux版本号的几种方法
- 生活学习感悟
- 谈谈评价指标中的宏平均和微平均
- 77. 最长严格上升子序列(动态规划)
- 进程与线程
- Android 中部分文字高亮显示方法
- 两个字符串的最大公共子序列和最大公共子串
- Toolbar使用说明
- Redis 主从配置和参数详解
- python函数传参是传值还是传引用?
- Python学习笔记——语法基础
- 利用 rsync 在服务器间同步目录
- 从一个问题来认识android:configChanges属性
- 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案
- [Java实现]通过一个Java小程序(吃苹果)深入理解面向对象思想
- Android 中 handle Message 的简单使用笔记
- [国嵌攻略][143][LCD驱动程序分析]
- Windows和Linux的进程地址空间分布
- C++第一次实验上机-3
- ubuntu查看安装的cuda toolkit自带的工具及其他安装文件