最长上升子序列
Time Limit: 3000MS Memory limit: 65536K
题目描述
一个数的序列bi,当b
1 < b
2 < ... < b
S的时候,我们称这个序列是上升的。对于给定的一个序列(a
1, a
2, ..., a
N),我们可以得到一些上升的子序列(a
i1, a
i2, ..., a
iK),这里1<= i
1 < i
2 < ... < i
K <= 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[N];
- int jishu[N];
- 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;
- }
代码菜鸟。如有错误,请多包涵!!!~