首页 > 其他分享 >花店橱窗(线性DP)

花店橱窗(线性DP)

时间:2024-02-04 09:01:49浏览次数:27  
标签:花店 橱窗 23 int 美观 花瓶 DP true dp

线性DP——花店橱窗

谨以此题解献给线性dp最后一道题

题目大致

Description

xq和他的老婆xz最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里。但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的花束时,会产生不同的美学效果。为了使橱窗里的花摆放的最合适,他们得想个办法安排每种花的摆放位置。
可是因为xq和xz每天都太忙,没有时间设计橱窗里花的摆法,所以他们想让你帮他们求出花摆放的最大美观程度和每种花所放的位置。
注:标号小花必须放在标号大的前面。
每种花放在不同的瓶子里会产生不同的美观程度,美观程度可能是正数也可能是负数。
上述例子中,花瓶与花束的不同搭配所具有的美观程度,如下表所示:
花 瓶
1 2 3 4 5
1 (杜鹃花) 7 23 -5 -24 16
2 (秋海棠) 5 21 -4 10 23
3 (康乃馨) -21 5 -4 -20 20
根据上表,杜鹃花放在花瓶2中,会显得非常好看;但若放在花瓶4中则显得十分难看。

Input Format

第1行:两个整数F和V,表示xq和xz一共有F种花,V个花瓶。(1<=F<=V<=100)
第2行到第F+1行:每行有V个数,表示花摆放在不同花瓶里的美观程度值value。(美观程度和不超过maxint,美观程度有正有负。)

Output Format

输出有两行:第一行为输出最大美观程度和的值,第二行有F个数表示每朵花应该摆放的花瓶的编号。

Sample

样例输入
3 5 
7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20
样例输出
53
2 4 5

Hint

其实就是简单的DP,花店橱窗问题啦。

注意尽量靠前放啊!

解析

在题目中有几个比较重要的地方:

  1. 所有花都要按照规定的顺序排放
  2. 如有美观程度相等的方案,花遵循靠前放置的原则
  3. 本题涉及负数

我们再来看如何求解

先看样例:因为要顺序排放,所以我们先看1号花。1号花可以摆在1、2、3号花瓶,但不能摆在3,4号花瓶,否则剩下的两朵花就没有地方了。同样,2号花可以摆在2、3、4号花瓶,但不能摆在1、5上,否则1、3号花就没有位置了。

1 2 3 4 5
1 true true true false false
2 false true true true false
3 false false true true true

于是我们可以得出规律:我们只需要更新第\(i\)到第\(V-F+i\) (\(i\)为花的编号)的dp就可以了。也就是只更新绿色位置的dp状态。

然后,根据题目可知,花要顺序摆放,那么第\(i\)朵花也一定和第\(i-1\)的花有关。看样例:

下面的表格表示dp状态。我们令dp[花的编号][花瓶编号]。第一朵花没有前面的花,所以直接根据美观程度更新。第4、5号位不更新。

1 2 3 4 5
1 7 23 -5 0 0
2

接着更新dp[2],2、5号位不更新。第2号位置只能由dp[1][1]来更新,所以直接继承。dp[2][2] = dp[1][1] + w[2][2]。w表示不同花在不同花瓶的美观程度。

1 2 3 4 5
1 7 23 -5 0 0
2 7+21=28

更新dp[2][3]时,为了达到最大,需要找到dp[1][1]dp[1][2]的最大值,也就是dp[1][2]

1 2 3 4 5
1 7 23 -5 0 0
2 28 23+(-4)=19

同理可得:

1 2 3 4 5
1 7 23 -5 0 0
2 28 19 23+10=33
1 2 3 4 5
1 7 23 -5 0 0
2 7(无用) 28 19 33 0
3 7(无用) 28(无用) 24 8 53

易得,最大美观值为53。所以dp状态转移方程为\(dp[i][j]\, =\, max\left \{ {dp[i-1][k]} \right \} \, +\, w[i][j]\, \, (k\in [i-1,\, j-1])\)。

由于\(i\)只和\(i-1\)有关,可以使用滚动数组优化。去掉dp一个维度的同时,注意循环中\(k\)的方向要从后往前。最后在dp[\(F\)]中找到最大答案。

记录路径也很好实现。开个数组p[i][j]记录前驱。具体实现看代码。

#include<bits/stdc++.h>
using namespace std;
#define s(n) scanf("%d", &n)
int ed, num, dt=1, mx, v, f, ans, w[102][102], dp[102], p[102][102];
inline void pt(int a, int b){ //输出路径
    if(a == 1){
        printf("%d", b);
        return;
    }
    pt(a-1, p[a][b]);
    printf(" %d", b);
}
int main(){
    s(f), s(v);
    for(int i=1; i<=f; ++i) //读入数据
        for(int j=1; j<=v; ++j)
            s(w[i][j]);
    for(int i=1; i<=f; ++i){
        for(int j=v-f+i; j>=i; --j){ //因为要自我滚动,所以从后往前循环 
            for(int z=i-1; z<j; ++z){
                if(z == i-1) mx = dp[z], num = z;
                else if(mx < dp[z]) mx = dp[z], num = z;
            }
            dp[j] = mx + w[i][j];
            p[i][j] = num;
            if(i == f){
                if(dt) ans = dp[j], dt = 0, ed = j;
                else if(ans <= dp[j]) ans = dp[j], ed = j; //注意 一定是小于等于 因为要靠前放
            }
        }
    }
    printf("%d\n", ans);
    pt(f, ed); //输出路径
    return 0;
}

the end

标签:花店,橱窗,23,int,美观,花瓶,DP,true,dp
From: https://www.cnblogs.com/xiaolemc/p/18005039

相关文章

  • 动态规划--线性dp
    线性dp动态规划步骤:1.状态表示用几维度的数组,每一维度的意思。2.状态计算状态转移方程   题目:数字三角形给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最......
  • DP
    numbertriangles感觉都与方格密切相关,比较好懂,重点在于对信息的分析(手玩)1.AcWing1018.最低通行费题意:一个\(n*n\)的方格,每个格子由一定的通行费,一个格子花费1个时间,要求在\(2*n-1\)的时间内从左上走到右下,求完成时的最低通行费。分析:显然,必须走最短路,即\(→\)或\(↓\),其它......
  • 使用到UDP协议的情况下该如何防护
    一、UDP协议概述UDP(UserDatagramProtocol,用户数据报协议)是TCP/IP协议栈中的一种无连接的传输协议,能够提供面向事务的简单不可靠数据传输服务。1.UDP的应用场景由于缺乏可靠性且属于非连接导向协议,基于UDP协议的应用一般必须允许一定量的丢包、出错和复制粘贴。与TCP协议不同,UDP协......
  • 20240130-DP以及优化随记
    状态转移方程递归关系(从已知求得未知的表达式)背包dp0-1背包,多重,完全,混合模版套用//多重背包#include<bits/stdc++.h>usingnamespacestd;constintN=507,M=1e5+7;intp,n,x,y,z,dp[10005];intmain(){ cin>>p>>n; for(inti=1;i<=n;i++){ scanf("%d%d......
  • 运输层的TCP与UDP协议(学习笔记)
    一、运输层1.逻辑通信结构2.端口号、复用与分用二、TCP与UDP的区别1.概览图2.用户数据报协议UDP(UserDatagramProtocol)UDP面向应用层报文,可以在任何时候发起传输(无连接),向上层提供不可靠传输服务,即如果传输过程中出现误码,也不会触发重传。可以支持一对一、......
  • 如何优雅的处理特殊的子集 dp 问题
    sosdp&高维前缀和求\[g_i=\sum_{j\&i>0}f_j(i\leq2^n-1)\]我们将\(i,j\)进行二进制拆分,拆成\(n\)个维度。类似于:\[g_{a_1,a_2,a_3,a_4,a_5...a_n}=\sum_{a_k\leqb_k}f_{b_1,b_2,b_3,b_4,b_5...b_n}(a_i,b_i\subseteq\{0,1\}......
  • AT_dp 26 题
    AT_dp26题A.Frog1直接dp。设\(f_i\)表示调到石头\(i\)的最小费用,则有\[f_i=\min(f_{i-1}+\left|a_i-a_{i-1}\right|,f_{i-2}+\left|a_i-a_{i-2}\right|)\]B.Frog2上一题的升级版,同样设\(f_i\)表示调到石头\(i\)的最小费用,则有\[f_i=\min_{j=i-k}^{i-1}f_j+\lef......
  • WordPress 技巧:解决 3.6 版本的 "wpdb::escape is deprecated" 错误提示
    来源:http://www.shanhubei.com/archives/13621.html升级到WordPress3.6之后,发现在debuglog中有很多以下的错误信息:Notice:wpdb::escapeisdeprecatedsinceversion3.6!Usewpdb::prepare()oresc_sql()instead.这个错误信息的意思是WordPress3.6将$wpdp类......
  • SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
    开发目的: 提高百万级数据插入效率。采取方案: 利用ThreadPoolTaskExecutor多线程批量插入。采用技术: springboot2.1.1+mybatisPlus3.0.6+swagger2.5.0+Lombok1.18.4+postgresql+ThreadPoolTaskExecutor等。application-dev.properties添加线程池配置信息#异步线程配置#配置核......
  • ajax与action,WordPress主题开发之wp_ajax_{$action}和wp_ajax_nopriv_{$action}的区
    wp_ajax_{$action}和wp_ajax_nopriv_{$action}是WordPress主题开发常用的函数,这两个函数经常用在ajax交互功能上。例如ajax表单登录,ajax提交表单等。本篇文章主要讲述了wp_ajax_{$action}和wp_ajax_nopriv_{$action}之间的区别。WordPress中AJAX请求方式在说wp_ajax_{$action}......