codeforces 148E

来源:互联网 发布:win10win7共享网络 编辑:程序博客网 时间:2024/06/06 02:00

题意:给你n个架子,每个架子有c个花瓶,每个花瓶有价值,从每个架子拿花瓶的时候只能从最外面部分开始拿(最左端和最右端)你现在要从n个架子里拿m个花瓶,求最大价值

很经典的组合背包模型了,注意预处理出每个架子拿k个花瓶的最大价值,然后都不用二进制优化,直接裸的三方可过

////  Created by Matrix on 2016-01-22//  Copyright (c) 2015 Matrix. All rights reserved.//////#pragma comment(linker, "/STACK:102400000,102400000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <sstream>#include <set>#include <vector>#include <stack>#define ALL(x) x.begin(), x.end()#define INS(x) inserter(x, x,begin())#define ll long long#define CLR(x) memset(x, 0, sizeof x)using namespace std;const int inf = 0x3f3f3f3f;const int MOD = 1e9 + 7;const int maxn = 1e4 + 10;const int maxv = 1e3 + 10;const double eps = 1e-9;int dp[105][maxn];int c;int a[maxn];int val[maxn];int suml[maxn];int sumr[maxn];int main() {#ifdef LOCAL    freopen("in.txt", "r", stdin);//  freopen("out.txt","w",stdout);#endif    int n, m;    while(scanf("%d%d", &n, &m) != EOF) {        memset(dp, 0, sizeof dp);        dp[0][0] = 0;        for(int i = 1; i <= n; i++) {            scanf("%d", &c);            for(int j = 1; j <= c; j++) {                scanf("%d", &a[j]);            }            suml[0] = 0;            for(int j = 1; j <= c; j++) {                suml[j] = suml[j-1] + a[j];            }//            for(int j = 1; j <= c; j++) {//              printf("suml[%d] = %d\n", j, suml[j]);//            }            sumr[c+1] = 0;            for(int j = c; j > 0; j--) {                sumr[j] = sumr[j+1] + a[j];            }//            for(int j = 1; j <= c; j++) {//              printf("sumr[%d] = %d\n", j, sumr[j]);//            }            memset(val, 0, sizeof val);            for(int l = 0; l <= c; l++) {                for(int r = l + 1; r <= c + 1; r++) {                    int nu = l + c + 1 - r;                    val[nu] = max(val[nu], suml[l] + sumr[r]);                }            }//            for(int j = 0; j <= c; j++) {//              printf("val[%d] = %d\n", j, val[j]);//            }            for(int j = 0; j <= m; j++) {                for(int k = 0; k <= c && k <= j; k++) {                    dp[i][j] = max(dp[i][j], dp[i-1][j-k] + val[k]);                }            }        }        printf("%d\n", dp[n][m]);    }    return 0;}
0 0
原创粉丝点击