文章

14

粉丝

230

获赞

26

访问

70.4k

头像
最大子段和以及下标
P1664 中南大学机试题
发布于2022年8月23日 12:06
阅读数 4.9k

核心就是dp[i] = max(dp[i-1] + a[i], a[i])

开始下:需要重新计数时,dp[i]=a[i],更新开始下标,同时结束下标也需要更新

结束下标:当dp[i-1]+a[i]>a[i],结束下标更新

初始化ans=0,这样判断当前dp[i]>ans时,如果dp为负数,就不会更新ans的值,ans为0,符合题目要求,不用单独处理结果为负数的情况

#include<bits/stdc++.h>
using namespace std;

int a[100005];
int dp[100005];
int main()
{

   int num=0;

   while(cin>>num){

    for(int i=1;i<=num;i++){
        cin>>a[i];
    }
     int ans=0;
   int b=1,e=1,ee=1,bb=1;
    dp[1]=a[1];
    for(int i=2;i<=num;i++){
            if(dp[i-1]+a[i]>a[i]){
                e=i;
                dp[i]=dp[i-1]+a[i];
            }
            else{
                dp[i]=a[i];
                b=i;
                e=i;
            }

            if(dp[i]>ans){
                ans=dp[i];
                ee=e;
                bb=b;
            }

    }
    printf("%d %d %d\n",ans,bb-1,ee-1);

   }

    return 0;
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发