HDOJ 1003 maxsum
http://acm.hdu.edu.cn/showproblem.php?pid=1003
思路:就是求最大的子段和,只是要标记起始位置和末尾置,注意begin和end的标记
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int sum[100005];
int dp[100005];
int begin , end;
void DP(int m){
int i , j;
int max , mark;要用一个mark来作为中间变量判断是否要改变begin
begin = 1 ;
end = 1;
memset(dp , 0 , sizeof(dp));
dp[0] = sum[0];
max = dp[0];
mark = 1;
for(i = 1; i < m ;i++){
if(dp[i-1] >= 0){
dp[i] = sum[i] + dp[i-1];
}
if(dp[i-1] < 0){
dp[i] = sum[i];
mark = i + 1;
}
if(max < dp[i]){//更新了max后就要改变end
max = dp[i];
begin = mark;//注意这个地方
end = i + 1;
}
}
printf("%d %d %d\n" , max , begin , end);
}
int main(){
int n , m;
cin>>n;
for(int i = 1 ; i <= n ; i++){
cin>>m;
memset(sum , 0 , sizeof(sum));
for(int j = 0 ; j < m ; j++)
cin>>sum[j];
printf("Case %d:\n",i);
DP(m);
if(i != n)
cout<<endl;
}
return 0;
}