HDU 1003 Max Sum
思路:
1.用一个变量max_s记录最大的字串和,初始为-1001;
2.我们需要发现一个规律,和最大的子串的前n(0<n≤len)一定是正数,否则砍去这个前n项我们能得到一个和更大的子串,除非这个子串只由一个负数组成;
3.使用一个变量ans记录当前子串的和,如果ans>max_s则更新max_s和最大串的左右端点;如果ans<0则抛弃当前子串,即更新ans为0;
代码:
#include<iostream>
using namespace std;
const int MAX_N=1e5+99;
int arr[MAX_N];
int main(){
int t,kase=0;
cin>>t;
while(t--){
cout<<"Case "<<(++kase)<<":\n";
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>arr[i];
int bg=1,lf,rt,max_s=-1001,ans=0;
for(int i=1;i<=n;i++){
ans+=arr[i];
if(ans>max_s){
max_s=ans;
lf=bg;
rt=i;
}
if(ans<0){
ans=0;
bg=i+1;
}
}
cout<<max_s<<' '<<lf<<' '<<rt<<'\n';
if(t) puts("");
}
return 0;
}

浙公网安备 33010602011771号