题目
该游戏可以由两个或两个以上的玩家玩。它由一个棋盘(棋盘)和一些棋子(棋子)组成,所有棋子均标有正整数或“开始”或“结束”。播放器从起点开始,必须最终跳到终点。在跳跃过程中,玩家将走访这条棋子,但是每个人都必须从一个棋子跳到另一个绝对更大的棋子(您可以假设起点是最小的,终点是最大的)。而且所有玩家都不能倒退。一跳可以从一个国际象棋棋子跳到下一个,也可以跨越许多国际象棋棋子,甚至您也可以从起点直接到达终点。在这种情况下,您当然会得到零分。一个球员只有并且根据他的跳跃解决方案能够获得更大的分数时才是赢家。
您的任务是根据给定的西洋棋棋子列表输出最大值。
输入值
输入包含多个测试用例。每个测试用例的描述如下:
N value_1 value_2…value_N
确保N不超过1000,并且所有value_i都在32-int范围内。
以0开头的测试用例将终止输入,并且该测试用例将不被处理。
输出量
对于每种情况,请按照规则打印最大值,然后一行打印一种情况。
思路
说白了就是给你一组数据,然后计算最大的连续和。dp[i]代表i之前所有元素的最大递增连续和,包括第i个位置的元素。这道题注意要考虑的全是负数的状态,那样可以直接从起点跳到终点。最大值也就是0。
代码
#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
int n;
while (cin >> n && n) {
int arr[1005];
int dp[1005];
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
dp[0] = arr[0];
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (arr[i] > arr[j])
dp[i] = max(dp[i], dp[j] + arr[i]);
else
dp[i] = max(dp[i],arr[i]);
}
}
int Max = 0;
for (int i = 0; i < n; ++i) {
Max = max(Max, dp[i]);
}
cout << Max << endl;
}
return 0;
}