之前做过最长递增子序列,这次碰到一个最大递增子序列,题意如下:
有一个跳跳棋棋盘,棋盘上面每个位置都有一个正数,你只能从左到右跳,每踩到一个位置,你的总分就加上该位置的数,一次可以跳一个或者多个,并且,你踩的数只能越踩越大
求最大你能得到的总分
状态转移公式如下:
dp[i] = max{ dp[0],dp[1],....dp[j] } &&chess[max_pos]<chess[i] (1<=j<i)
(其中,chess[]数组保存了棋盘上的数,dp[max_pos]是前j个位置中,最大的那个)
代码如下:
#include<cstdio>
const int N = 1010;
void Max(__int64 dp[],int chess[],int len){
__int64 max=dp[len];
int pos=len;
for(int i=len-1;i>=1;i--){
if(chess[pos]>chess[i]&&max<dp[i]){
max = dp[i];
}
}
dp[len] = max + chess[len];//更新dp数组
}
int main(){
int n,chess[N]={0};
__int64 dp[N];
while(scanf("%d",&n)&&n){
for(int i=0;i<N;i++)dp[i]=0;
for(int i=1;i<=n;i++)scanf("%d",&chess[i]);
for(int i=1;i<=n;i++){
Max(dp,chess,i);//找出符合chess[max_pos]<chess[i]的dp[max_pos]
}
int tmp = 0;
for(int i=1;i<=n;i++){
if(dp[i]>tmp){
tmp = dp[i];
}
}
printf("%d\n",tmp);
}
}