Hdu 1257 LIS拦截系统 最大上升子序列或动态规划

语言表达能力欠佳。。。

思路一:依次递减序列的最小个数其实就是求最大上升子序列

思路二:正常思路:开始所有的(就是dp数组)都默认为使用系统1,a[i]>a[j](0<j<i)dp[i]=max(dp[i],dp[j]+1).

例如 4     8 100 6 3

当i遍历到第最后一个的时候,对于系统1,如果a[i]<系统1的最小高度,就会被拦截。a[i]就一定会是比系统2的最小高度要小(即是3>100),因为如果前面是2(2<3),2一定会比3先被系统1拦截

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100000
int a[maxn];
int dp[maxn];

int main()
{
	int N;
	while(EOF!=scanf("%d",&N))
	{
		int i,j;
		for(i=0;i<N;i++){
			scanf("%d",&a[i]);
			dp[i]=1;
		}
		for(i=0;i<N;i++){
			for(j=0;j<i;j++){
				if(a[i]>a[j]){
					dp[i]=max(dp[i],dp[j]+1);
				}
			}
		}	
		int Max=0;
		for(i=0;i<N;i++){
			Max=max(dp[i],Max);
		}
		cout << Max << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41755258/article/details/83022704