• cf105 E. Porcelain 背包dp


    点击打开链接


    题意:

    有n排花盆,每排有k个,然后有个人想扔m个花瓶,每个花瓶有个价值val

    他只能选择每一排的最左边或者最右边扔

    求扔的最大价值

    思路: bag[i][j]表示第i排扔j个的最大价值, dp[i][j]表示前i排扔j个的最大价值,背包dp

    转移:dp[i][j] = max(dp[i][j],dp[i-1][j-k]+bag[i][k])  0<=k<=t[i];

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 105;
     4 
     5 int n,m,t[maxn],a[maxn][maxn],bag[maxn][maxn];
     6 int dp[maxn][10001];
     7 
     8 int main(){
     9     cin >> n >> m;
    10     for(int i=1; i<=n; i++){
    11         cin >> t[i];
    12         for(int j=1; j<=t[i]; j++){
    13             cin >> a[i][j];
    14             a[i][j] += a[i][j-1];
    15         }
    16     }
    17 
    18     for(int i=1; i<=n; i++)
    19         for(int j=1; j<=t[i]; j++)
    20             for(int k=0; k<=t[i] && k<=j; k++)
    21                 bag[i][j] = max(bag[i][j], a[i][j-k] + a[i][t[i]] - a[i][t[i]-k]);
    22 
    23     for(int i=1; i<=n; i++)
    24         for(int j=0; j<=m; j++)
    25             for(int k=0; k<=t[i] && k<=j; k++)
    26                 dp[i][j] = max(dp[i][j],dp[i-1][j-k]+bag[i][k]);
    27 
    28     cout << dp[n][m] << endl;
    29 }
  • 相关阅读:
    实心菱形
    进制转换
    简单题目
    一元二次方程求解
    反转整数
    最大公约数
    数老鼠
    “鱼额宝”
    数组第K小数
    最大子数组和
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827738.html
Copyright © 2020-2023  润新知