codeforces 148E Porcelain(DP, 分组背包)

题意:
有n个数列。要从这n个数列中取m个数,要求值最大。
思路:
每个数列的大小为si, 则可以从中取[1,si]个。
理解了这是一个分组背包的模型后。。就很赤裸了。。

    rep(r, 1, n) {
        scanf("%d", &t);
        rep(i, 1, t) scanf("%d", a+i);

        rep(i, 1, t) pre[i] = pre[i-1]+a[i];
        rep(i, 1, t) suf[i] = suf[i-1]+a[t-i+1];

        rep(i, 1, t) {
            v[i] = 0;
            rep(j, 0, i) v[i] = max (v[i], pre[j]+suf[i-j]);
        }

        urep(w, m, 1) {
            for (int i=1;i<=t && i<=w;++i)
                dp[w] = max (dp[w], dp[w-i] + v[i]);
        }
    }
    printf("%d", dp[m]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值