HDU 1024-Max Sum Plus Plus(dp,各种时空优化)

给你一个长度为n的数组,求互不重合的m个子数组的和的最大值。

推一波大佬的博客
https://www.cnblogs.com/dyhaohaoxuexi/p/11337487.html

写bug写了好久。。。
先说一下有啥坑吧:
1.数组可以是负值,且数组较大,和的范围是【 -32,768,000,000~32,768,000,000】
我们平时习惯用的0x3f3f3f3f是不够用的
2.状态转移方程需要特判一个首位

难点:这个题的难点是n的值特别大 1,000,000范围,循环只能跑两层,数组也不能开二维的。
思路:的和上面大佬的博客一样。。。

代码:

#include 
#include 
#include 

using namespace std;

#define ll long long
#define INF 0x3f3f3f3f3f3f3f3f

int n, m;
ll arr[1000005];
ll dp[1000005];
ll mmax[1000005];

int main() {
#ifdef Wang_Zhifeng
    freopen("in.txt", "r", stdin);
    setvbuf(stdout, NULL, _IOFBF, 1024);
#endif
    while(~scanf("%d%d", &m, &n)) {
        memset(dp, 0, sizeof(dp));
        memset(mmax, 0, sizeof(mmax));
        mmax[0] = -INF;
        for(int i = 1; i <= n; ++i)scanf("%lld", &arr[i]);

        for(int i = 1; i <= m; ++i) {
            ll tmp;
            dp[i] = dp[i-1]+arr[i];
            tmp = mmax[i];
            mmax[i] = dp[i];
            for(int j = i+1; j <= n; ++j) {
                dp[j] = max(dp[j-1], tmp)+arr[j];
                tmp = mmax[j];
                mmax[j] = max(mmax[j-1], dp[j]);
            }
        }
        printf("%lld\n", mmax[n]);
    }
    return 0;
}

你可能感兴趣的:(HDU 1024-Max Sum Plus Plus(dp,各种时空优化))