高山速降比赛(dp最长递减子序列)

描述

滑雪场举行了一场高山速降比赛,起点高度1000米,终点高度为0,举办者在中途设置了若干多个高度不同的落脚点,规定所有选手只能从起点到终点单向运动,每到达一个落脚点可以获得一个积分奖励,但是后一个得分落脚点的高度必须低于他前面得过分的落脚点,请你帮选手选择一条路线,使得他可以获得最多的积分奖励。

例如有以下数据:

1000 614 971 509 838 743 968 0

表示一共有8个落脚点(含起点和终点),最多可以获得5个积分(选择的落脚点分别是:1000,971, 838,743, 0),注意最优路线可能有多条,但是获得的最多积分是相同的。

再比如有以下数据:

1000 378 174 370 899 54 482 238 459 0

可以获得的最多积分也是5。

格式

输入格式

两行,第一个行是一个整数n(3≤n≤500),表示落脚点的数目(含起点和终点)。
第二行是n个整数,表示每个落脚点的高度(中途落脚点的高度均位于0到1000之间)

输出格式

一个整数,表示可以获得的最多积分

样例

输入样例

10
1000 217 3 942 19 691 844 706 813 0

输出样例

5

限制

时间限制:1000 ms

内存限制:32767 KB

贴一个单调递增最长子序列

#include <iostream>
#include <string.h>
using namespace std;

int main(){
    int n, maxn=0, sum=0;
    int a[505], dp[505];
    memset(dp, 0, sizeof(dp));
	scanf ("%d", &n);
    for (int i=0; i<n; i++) {
    	scanf ("%d", &a[i]);
	}
	for (int i=0; i<n; i++) {
		dp[i] = 1;
		for (int j=0; j<i; j++) {
			if (a[i]<a[j] && dp[i]<dp[j]+1) {
				dp[i] = dp[j] + 1;
			}
		}
	}
	for (int i=0; i<n; i++) {
		if (dp[i] > maxn) {
			sum++;
			maxn = dp[i];
		}
	}
	printf ("%d", sum);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章