高山速降比賽(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;
}

 

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