描述
滑雪場舉行了一場高山速降比賽,起點高度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;
}