E - Super Jumping! Jumping! Jumping!
题目入口:E - Super Jumping! Jumping! Jumping!
杭电入口:Super Jumping! Jumping! Jumping!
解题思路
测试样例:多组样例 以N==0结束
规则:每次只能跳到更大的数字上
求解:最大得分
已知:棋子数N<=1000
用a[1010]存放棋子
模型定位:最大不连续子列和(动态规划)
dp[i]
记录i前面更小数加上当前更大数字后dp[j]+a[i]
与自身dp[i]
的最大值
dp[i]初始化为a[i]的值
含义为到第i个数时最大值暂且为第i个数本身
待i前面更小数加上第i个数值后dp[j]+a[i]
进行更新
Max不断取dp[i]的最大值 最终得到最大和即最大得分
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1010;
int a[MAXN];
int dp[MAXN];
int main() {
int n;
while (~scanf("%d", &n) && n){
memset(a, 0, sizeof(a));
int Max = 0;
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
dp[i] = a[i];
}
for (int i = 1; i < n; i++){
for (int j = 0; j < i; j++){
if (a[i] > a[j] && dp[j]+a[i] > dp[i])
dp[i] = dp[j]+a[i];
Max = max(Max, dp[i]);
}
}
printf("%d\n", Max);
}
return 0;
}