Super Jumping! Jumping! Jumping!(dp求最大递增子序列和)

这是一个关于计算棋盘游戏中最大跳跃得分的问题。玩家从最小的棋子开始,必须按递增顺序跳跃,目标是达到最大的棋子。给定一个棋子值列表,你需要找出能获得的最大连续和。提供的代码实现了一个动态规划解决方案,通过比较当前位置与之前位置的组合来找到最大和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

题目

该游戏可以由两个或两个以上的玩家玩。它由一个棋盘(棋盘)和一些棋子(棋子)组成,所有棋子均标有正整数或“开始”或“结束”。播放器从起点开始,必须最终跳到终点。在跳跃过程中,玩家将走访这条棋子,但是每个人都必须从一个棋子跳到另一个绝对更大的棋子(您可以假设起点是最小的,终点是最大的)。而且所有玩家都不能倒退。一跳可以从一个国际象棋棋子跳到下一个,也可以跨越许多国际象棋棋子,甚至您也可以从起点直接到达终点。在这种情况下,您当然会得到零分。一个球员只有并且根据他的跳跃解决方案能够获得更大的分数时才是赢家。
您的任务是根据给定的西洋棋棋子列表输出最大值。
 

输入值
输入包含多个测试用例。每个测试用例的描述如下:
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值