杭电oj 1003题解答

这题需要利用动态规划来解决,也可能会考到数组越界的问题。不用想太复杂,就是求出每个子序列的值然后与之前的最大值比较大小(当然前子序列为负值则把清为零),最终运行出来的就是最大值。

#include <iostream>
using namespace std;
static int a[100001];
int main()
{
    int T = 0;
    cin >> T;//输入的第一行包含一个整数 T(1<=T<=20),表示测试用例的数量 
    for (int i = 1; i <= T; i++)
    {
        cin >>a[0];//输入这个开头的数N
        int Sum = 0, b = -1001, r = 1, m, M;//“Sum”子序数的和值(记住不是最大值);“b”是最大值,在这里从最小开始,通过替换得到最后的最大值;“r”是最初的序列值;“m”是起始的序列值;“M”是最末尾的序列值
            for (int i = 1; i <= a[0]; i++)
            {
                cin >> a[i];//输入N个整数
            }
            
            for (int i = 1; i <= a[0]; i++)
            {
                Sum += a[i];//子序列的和
                if (Sum > b)//比较这这个子序列和最大值,当这个子序列的和值大于了最大值则交换
                {
                    b = Sum;//
                    m = r;//起始的序列值则与最初序列值交换
                    M = i;//末尾的序列值则与i(i为子序列的末端)交换
                }
                if (Sum < 0)//当这个子序列的值小于零则舍弃
                {
                    r = i + 1;//初始的序列值就变为末尾的序列值加一,但是不代表起始序列值加一
                    Sum = 0;
                }
            }
        cout << "Case"<< i<< ' ' <<":" << endl;
        cout << b << ' ' << m <<' ' << M << endl;
    }
    return 0;
}

当然方法并不唯一,如果有更好的方法可以分享一下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值