文章
14
粉丝
230
获赞
26
访问
71.2k
核心就是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;
}
登录后发布评论
暂无评论,来抢沙发