HDOJ 1024 Max Sum Plus Plus

点击打开链接 http://acm.hdu.edu.cn/showproblem.php?pid=1024

思路:利用动态规划的方法,求解最大m子段的和,由于这一题的数据量很大,所以不能用二维的dp 方     程,考虑优化

            用一个temp[1000005]来存储前j个元素的i个子段的最大和,则有dp[j]=max(dp[j-1]+s[j],temp[j-1]]+s[j]) 表示以s[j]结尾的元素的最大的子段和


注意:输入数据很多使用scanf


代码:
#include <iostream>
#include <algorithm>
#include <map>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int s[1000005];
int dp[1000005];
int temp[1000005];
void DP(int m , int n){
    int i , j , k;
    int max;
    memset(dp , 0 ,sizeof(dp));
    memset(temp , 0 , sizeof(temp));
    for(i = 1 ; i <= m ; i++){//用以个for循环遍历
        max = -999999999;//注意这里的max要为无穷小,分别在求i子段最大和时候进行初始化
        for(j = i ; j <= n ; j++){
            dp[j] = (dp[j-1] + s[j]) > (temp[j-1] + s[j])?(dp[j-1] + s[j]) : (temp[j-1] + s[j]);
            temp[j-1] = max;//这里的temp[j-1]用来存储前面j-1的元素i子段最大值,注意不是temp[j]因为还没判 断是否max<dp[j];
            if(max < dp[j])
               max = dp[j];//更新max
            }
    }
    cout<<max<<endl;
}
int main(){
    int i , j;
    int n , m;
    while(scanf("%d%d" , &m , &n) != EOF){
        for(i = 1 ; i <= n ; i++)
            scanf("%d" , &s[i]);
        DP(m , n);
    }
    return 0;
}

posted on 2012-06-25 12:48  c语言源码  阅读(174)  评论(0编辑  收藏  举报

导航