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 
#include 
#include 
#include 
#include 
#include 
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


你可能感兴趣的:(HDOJ 1024 Max Sum Plus Plus)