題目
如今,一種名爲“超級跳躍!跳!跳!” 在HDU中非常受歡迎。也許您是個好孩子,對這個遊戲瞭解得很少,所以現在向您介紹一下。
該遊戲可以由兩個或兩個以上的玩家玩。它由一個棋盤(棋盤)和一些棋子(棋子)組成,所有棋子均標有正整數或“開始”或“結束”。播放器從起點開始,必須最終跳到終點。在跳躍過程中,玩家將走訪這條棋子,但每個人都必須從一個棋子跳到另一個絕對更大的棋子(您可以假設起點是最小值,終點是最大值)。而且所有玩家都不能後退。一跳可以從一個國際象棋棋子跳到下一個,也可以跨越許多國際象棋棋子,甚至您也可以從起點直接到達終點。在這種情況下,您當然會得到零分。一個球員只有並且根據他的跳躍解決方案能夠獲得更大的分數時纔是贏家。
您的任務是根據給定的西洋棋棋子列表輸出最大值。
輸入格式
輸入包含多個測試用例。每個測試用例的描述如下:N n[1]、n[2]、n[3]…n[N]確保N不超過1000,並且所有n[i]都在32-int範圍內。以0開頭的測試用例將終止輸入,並且該測試用例將不被處理。
輸出格式
對於每種情況,請按照規則打印最大值,然後一行打印一種情況。
樣例輸入
3 1 3 2
4 1 2 3 4
4 3 3 2 1
0
樣例輸出
4
10
3
代碼
#include<bits/stdc++.h>
using namespace std;
int dp[1010];//第一個存時間,第二個存位置
int a[1010];
const int inf=0x7fffffff;
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
int num=-111111111;
for(int j=0;j<i;j++){
if(a[i]>a[j]){ //判斷是否能跳
num=max(num,dp[j]);//判斷他的前面和取最大
}
}
dp[i]=num+a[i];//最優+本身
}
int sum=-1111111;
for(int i=0;i<=n;i++){
sum=max(sum,dp[i]);
}
printf("%d\n",sum);
}
return 0;
}