A numeric sequence of ai is ordered if
a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (
a1, a2, ..., aN) be any sequence (
ai1, ai2, ...,
aiK), where 1 <= i1 < i2 < ... <
iK <= N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).
Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.
Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.
The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000
Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.
7 1 7 3 5 9 4 8
4
题意就是找最长递增子序列;
1 | 7 | 3 | 5 | 9 | 4 | 8 | |
1 | 1 | 2 | 1 | 1 | 1 | 1 | 1 |
2 | 1 | 2 | 2 | 1 | 1 | 1 | 1 |
3 | 1 | 2 | 2 | 3 | 1 | 1 | 1 |
4 | 1 | 2 | 2 | 3 | 4 | 1 | 1 |
5 | 1 | 2 | 2 | 3 | 4 | 3 | 1 |
6 | 1 | 2 | 2 | 3 | 4 | 3 | 4 |
在看看代码,最好代码和图一起看:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[1005]; //记录当前位置往前最多有几个递减的数(包括当前位置的数);
int a[1005]; //储存原序列;
int main(){
int N;
scanf("%d",&N);
for(int i=1; i<=N; i++){
scanf("%d",&a[i]);
dp[i]=1; //初始化均为1;
}
for(int i=2; i<=N; i++){ //从第二个数开始找;
int temp=0; //记录递减的数的个数;
for(int j=1; j<i; j++) //从第1个一直找到第i个;
if(a[i]>a[j]) //if 找的一个较小的数就a[i]前边的递减的数的个数就改为a[j]前面的递减数的个数(记录最大的);
temp=max(temp, dp[j]); //例如: i=6;a[4]前递减数为2个,a[5]为3个,则temp=3;
dp[i]=temp+1; //加上本身的1;
}
int maxx=0;
for(int i=1; i<=N; i++) //找最大的;
maxx=max(maxx, dp[i]);
printf("%d\n", maxx);
return 0;
}