浏览器标题切换
浏览器标题切换end

PTA1007 - Maximum Subsequence Sum - 最大字段和尺取法/DP

思路

  1. 固定三个点,左节点,右节点和一个虚拟结点,记录下标,让虚拟结点不断往右跑,尺取法的思想

  2. DP,由于DP和尺取时间复杂度一样,这里就不放代码了

注意

特判全是负数的情况,如果全部元素都是负数,则输出 0 第一个元素值 最后一个元素值

如果不在最后特判的话,如果全是负数则错误,比如:
5
-1 -1 -1 -1 -1
就会输出错误答案:
0 -1 -1

AC代码

#include<iostream>
#include<algorithm>
#include<map>
#include<string.h>
#include<stdio.h>
#include<map>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f;

int a[10010];

int main()
{
    int n,cnt=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]<0) cnt++;
    }
    if(cnt==n)
    {
        cout<<0<<" "<<a[0]<<" "<<a[n-1]<<endl;
        return 0;
    }
    int l=0,r=0,l1=0,sum=0,ma=a[0]; // ma=0 + 下面if语句两行掉一下顺序在pta会错一组数据,ma必须为a[0],下面if条件顺序必须这样写,否则其他地方需要变一下
    for(int i=0;i<n;i++)
    {
        sum+=a[i];
        if(sum>ma) ma=sum,l=l1,r=i; // 条件不是sun>=0 更新l、r
        if(sum<0) sum=0,l1=i+1; // 让l1先去往右跑
//        if(sum>ma) ma=sum,l=l1,r=i; // 条件不是sun>=0 更新l、r
    }
    cout<<ma<<" "<<a[l]<<" "<<a[r]<<endl; // 输出最大值、左值、右值
    return 0;
}
posted @   抓水母的派大星  阅读(64)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-02-22 寒假Day32:CodeForces 1304-思维
点击右上角即可分享
微信分享提示