HDU 1024 Max Sum Plus Plus (dp, 降维)

  • 题目链接: HDU 1024 Max Sum Plus Plus
  • 题意:
    - 给出n个数, 取其中不相交的m个连续序列的累加和,问最大值为多少

  • 构造dp方程

    • 最直观的方程: dp[i][j] = MAX( dp[i-1][j]+a[i], dp[k][j-1]+a[i]) ( 1<=k < i )
    • 其中dp[i][j]表示,在必须取第i个数的前提下,将前i个数分成j段的最大值
    • 数据范围n->[1, 1000000], 而m未知,这种情况下,m稍微大点就会出现爆空间了,所以需要数组降维
      • 在不考虑a[i]的情况下,dp[i][j]只与dp[i-1][j]和MAX(dp[k][j-1]) (1< = k< i ) 有关。故只需要开两个数组,分别记录
        • ① dp[j]记录前i个数分成j段的最大值, (在未更新前i个数分成j-1段的最大值之前, dp[j-1]为将前i-1分成j-1段的最大值)
        • ② dp2[j]记录dp[k][j-1] (1 <= k < i) 的最大值
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define fir first
#define sec second
#define repp(i, a, b) for(int i=(b); i>=(a); --i)
#define rep(i,a,b) for (int i=(a); i<=(b); ++i)
#define de(x) cout<< #x << " => " << (x) << endl
#define ms(a, b) memset(a, b, sizeof(a))
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int inf = 0x3f3f3f3f;
const double PI=acos(-1);
const double eps=1e-9;
inline void file_put() {
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
}
const int maxn = 1e6+5;
int n, m;
int a[maxn];
ll dp1[maxn], dp2[maxn];
int main() {
//  file_put();
    while(~scanf("%d %d", &m, &n)){    
        rep(i, 1, n){
            scanf("%d", &a[i]);
        }
        ms(dp2, 0);
        dp1[0]=0;
        ll ans=-inf*inf;
        rep(i, 1, m){
            ans = -inf*inf;
            rep(j, i, n){
                dp1[j] = max(dp1[j-1]+a[j], dp2[j-1]+a[j]);
                dp2[j-1] = ans;
                ans = max(ans, dp1[j]); 
            }           
        }
        cout << ans <<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值