原题目:
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.
Input
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
Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.
Sample Input
7
1 7 3 5 9 4 8
Sample Output
4
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n,d[1005],dp[1005];
while(scanf("%d",&n)!=EOF)
{
for(int i=0; i<n; i++)
{
scanf("%d",&d[i]);
}
for(int i=0; i<n; i++)
{
dp[i]=1;
for(int j=0; j<i; j++)
{
if(d[i]>d[j])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int ans=-1;
for(int i=0; i<n; i++)
{
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}
中文概要:给你一个字符数组,让你求最大上升子序列
状态设计:dp[i]代表以a[i]结尾的LIS的长度
状态转移:dp[i]=max(dp[i], dp[j]+1) (0<=j< i, a[j]< a[i])
边界处理:dp[i]=1 (0<=j< n)
时间复杂度:O(N^2)
举例: 对于序列(1, 7, 3, 5, 9, 4, 8),dp的变化过程如下
dp[i] | 初始值 | j=0 | j=1 | j=2 | j=3 | j=4 | j=5 |
---|---|---|---|---|---|---|---|
dp[0] | 1 | ||||||
dp[1] | 1 | 2 | |||||
dp[2] | 1 | 2 | 2 | ||||
dp[3] | 1 | 2 | 2 | 3 | |||
dp[4] | 1 | 2 | 3 | 3 | 4 | ||
dp[5] | 1 | 2 | 2 | 3 | 3 | 3 | |
dp[6] | 1 | 2 | 3 | 3 | 4 | 4 | 4 |
求完dp数组后,取其中的最大值就是LIS的长度。【注意答案不是dp[n-1],这个样例只是巧合】
这个图也是十分清楚明了了,就盗过来了
但是这个代码复杂度有点高,数据小还可,大了就不中怕是会超时。