Super Jumping! Jumping! Jumping!
题意:无聊的猿发明了“人赢跳跳棋“,规则是要从Start->End,中途可以间隔着跳过若干个格子,但是下一步位置的权值必须大于当前格子的权值。最后,所经过格子的权值和大的获胜。
分析:不连续的最大递增子序列和问题。当我以第 i 个格子作为终点时我所能取得的最大和,其子问题是以第 i -1 个格子为终点时的最大和。情况有两种,当前 num[ i ] 大于前面 num[ j ] 时,有 dp[ i ] = max(dp[ i ], dp[ j ] + num[ i ]);当前 num[ i ] 小于前面 num[ j ] 时,则dp[ i ] = max(num[ j ], dp[ i ]);
代码如下:
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll a[1005],dp[1005];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n;
while(cin>>n && n){
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll ans=0;
memset(dp,0,sizeof(dp));
dp[1]=a[1];
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(a[i]>a[j]){
dp[i]=max(dp[j]+a[i],dp[i]);
}else dp[i]=max(dp[i],a[i]);
}
//dp[i]=max(dp[i],a[i]);
}
sort(dp+1,dp+n+1);
cout<<dp[n]<<endl;
}
return 0;
}