题目描述
思路解析
见我的令一篇博文:https://blog.csdn.net/weixin_43590232/article/details/104152766
AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10005;
int a[maxn];
int main() {
int n;scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int left=0,right=n-1,opt=a[0];
// dp[i]=max(dp[i-1]+a[i],a[i]);
int dp=a[0],tleft=0, tright=0;
for(int i=1;i<n;i++){
if(dp+a[i]>a[i]) {
dp=dp+a[i];
tright=i;
}
else{
dp=a[i];
tleft=i;tright=i;
}
if(dp>opt){
opt=dp;
left=tleft;right=tright;
}
}
if(opt<0){
opt=0;left=0;right=n-1;
}
printf("%d %d %d",opt,a[left],a[right]);
return 0;
}
暴力法
由于本题的规模不太大,直接用暴力法也不会时间超限。
关于最大能承受的问题规模,可以看:
https://blog.csdn.net/weixin_43590232/article/details/104155591
#include<iostream>
using namespace std;
int in[10005];
bool flag;
int main() {
int k; cin >> k;
for (int i = 0; i < k; i++) {
cin >> in[i];
if (in[i] >= 0) flag = true;
}
if (flag == false) {
printf("0 %d %d", in[0], in[k - 1]);
return 0;
}
int maxs = -1,a,b;
for (int i = 0; i < k; i++) {
//if (in[i] < 0) continue;
int sum = 0;
for (int j = i; j < k; j++) {
sum += in[j];
if (sum > maxs) {
maxs = sum;
a = in[i]; b = in[j];
}
}
}
printf("%d %d %d", maxs, a, b);
return 0;
}