最长上升子序列
2016-05-17 16:44
204 查看
最长上升子序列
Time Limit: 3000MS Memory limit: 65536K
题目描述
一个数的序列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)。
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
输入
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。输出
最长上升子序列的长度。示例输入
7 1 7 3 5 9 4 8
示例输出
4
来源
今天我想讲一个十分基础的题,希望能给初级读者一个好的方法和体悟
这里的主要方法是:用一个数组一一对应这向前查找找出他最小的:
具体举例就是:
用一个数组,数组的第一个为1.。
那第二个是7,大于1,则加1.
第三个大于1小于7那就在1上加1,
第四个是5大于1和3,那在比较1和3对应的数组那个大就选谁,这里就选3了
第五个也是这种方法
1 | 7 | 3 | 5 | 9 | 4 | 8 | |||||||||||||
1 | |||||||||||||||||||
2 | |||||||||||||||||||
,2 | |||||||||||||||||||
2..3 | 选3 | ||||||||||||||||||
2 | 3 | 3 | 4 | 选择4 | |||||||||||||||
2 | 3 | 选择3 | |||||||||||||||||
2 | 3 | 3 | 4 | 选择4 |
懂了吗?、
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1002
int a
;
int jishu
;
int main()
{
int n,m,i,j;
scanf("%d",&n);
for(i = 0;i < n; i++)
{
scanf("%d",&a[i]);
}
jishu[0] = 1; //第一个为1.。
for(i = 1;i < n; i++)
{
m = 0;
for(j = 0;j < i; j++)
{
if(a[i]>a[j])
{
if(jishu[j]>m)
{
m = jishu[j];
}
}
}
jishu[i] = m+1; //最大的数组加1
}
int max = 0;
for(i = 0;i < n; i++) //找最大的
{
if(max<jishu[i])
{
max = jishu[i];
}
}
printf("%d\n",max);
return 0;
}
代码菜鸟。如有错误,请多包涵!!!~
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wronged.gif)
相关文章推荐
- selenium+python控制鼠标移动
- Jquery修改image的src属性,图片不加载问题的解决方法
- 微博授权错误:Couldn't load weibosdkcore from loader dalvik.system.PathClassLoader
- 利用JavaScript制作瀑布流
- Android基础之十五数据存储 之 SQLite数据库的封装
- Navicat for MySQL 注册码
- leetcode 136. Single Number
- [剑指offer]链表中环的入口结点
- 使用MATLAB工具箱TOOLBOX_calib标定摄像头过程
- shell
- 每周学习进度第十一周
- Core Data 使用
- [POJ1236]Network of Schools(并查集+floyd,伪强连通分量)
- 已安装 SQL Server 2005,安装 SQL Server 2008 时提示需要删除 SQL Server 2005 Express 工具
- java实现ftp文件的上传与下载
- iOS判断字符串中是否含有非法字符
- msp430程序跑飞之解决方法
- Kafka安装配置、常用命令
- 自己的选择: Qt VS MFC
- hdu 2363(限制最短路 二分+枚举+最短路)