• codeforce problem 148 E


    题意:n排花盆,我们可选择m个,每排第一个数字为每排个数,然后给出每个花盆的价值,我们只能从左边或者右边取

    思路:bag[i][j]表示第i行取j个花盆的最大价值,那么每行我们可得到取1个,2个。。。。的最大价值,相当于体积为j,价值为bag[i][j],

       总容量为m个,这就有点像是背包了,dp[i][j]表示前i行取j个最大价值,不同的是这得一行一行取

     1 #include<bits/stdc++.h>
     2 using  namespace std;
     3 
     4 int dp[102][10005];
     5 int bag[102][10005];
     6 int t[103];
     7 int a[102][10005];
     8 
     9 int main(){
    10     int n,m;
    11     scanf("%d%d",&n,&m);
    12     for(int i=1;i<=n;i++){
    13         scanf("%d",&t[i]);
    14         for(int j=1;j<=t[i];j++){
    15             scanf("%d",&a[i][j]);
    16             a[i][j]+=a[i][j-1];
    17         }
    18     }
    19     //bag[i][j]表示第i行去除j个价值最大
    20     for(int i=1;i<=n;i++){
    21         for(int j=1;j<=t[i];j++){
    22             for(int k=0;k<=j;k++){
    23                 bag[i][j]=max(bag[i][j],a[i][k]+a[i][t[i]]-a[i][t[i]-(j-k)]);
    24             }
    25         }
    26     }
    27 
    28     for(int  i=1;i<=n;i++){
    29         for(int j=m;j>=0;j--){
    30             for(int k=0;k<=t[i]&&k<=j;k++)//对于这一行的j容量,取当前为k体积的价值//
    31                 dp[i][j]=max(dp[i][j],dp[i-1][j-k]+bag[i][k]);
    32         }
    33     }
    34     cout<<dp[n][m]<<endl;
    35 }
  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/hhxj/p/7226053.html
Copyright © 2020-2023  润新知