1007 Maximum Subsequence Sum (25 分) 动态规划

题目链接
首先这是一道动态规划,动态规划
然后就是选与不选的问题
如果选就是dp[i] =dp[i-1]+num[i];
如果不选是 dp[i] = num[i];
pre数组用于记录开始的位置
如果选pre[i] = pre[i - 1];
这样他就一直保持着开始选的那个位置
如果不选pre[i] = i;
然后就完成啦,dp保存的是到i的位置的最大的值
当然这里还需要注意这一句

If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

这里当然就是说如果所有的数都是复数然后就这样输出就可以了

if (Maxvalue == -1) {
        cout << "0" << " " <<num[0]<< " "<<num[n-1];
    }
#include<iostream>
#include<algorithm>
using namespace std;
int dp[10100];
int num[10100];
int pre[10100];
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> num[i];
    }
    dp[0] = num[0];
    pre[0] = 0;
    for (int i = 1; i < n; i++) {
        if (num[i] > dp[i - 1] + num[i]) {
            dp[i] = num[i];
            pre[i] = i;
        }
        else {
            dp[i] =dp[i-1]+num[i];
            pre[i] = pre[i - 1];
        }
    }
    int Maxindex, Maxvalue = -1;
    for (int i = 0; i < n; i++) {
        if (dp[i] > Maxvalue) {
            Maxvalue = dp[i];
            Maxindex = i;
        }
    }
    if (Maxvalue == -1) {
        cout << "0" << " " <<num[0]<< " "<<num[n-1];
    }
    else {
        cout << Maxvalue << " " << num[pre[Maxindex]] << " " << num[Maxindex];
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值