HDOJ 1003 maxsum

点击打开链接

思路:就是求最大的子段和,只是要标记起始位置和末尾置,注意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;
}

代码:





你可能感兴趣的:(max)