线性DP之小烈送菜
小烈送菜
小烈一下碰碰车就被乐满地的工作人员抓住了。作为扰乱秩序的惩罚,小烈必须去乐满地里的“漓江村”饭店端盘子。
服务员的工作很繁忙。他们要上菜,同时要使顾客们尽量高兴。一位服务生为 n个顾客上菜。这 n 个顾客坐成一排,小烈从一端的厨房中端出 n 盘菜(不要问我为什么小烈能一下子端住 2500 盘菜,他就是能)为 n个顾客各上一道相同的菜。显然,小烈需要走一个来回,如图:本来,小烈可以按 1,2,3...n的顺序一次给每个顾客上菜,但是,聪明的小烈通过观察发现,每个顾客都有一个开心值 H1,H2,H3…,Hn ,离厨房最近的为 H1,然后依次为 H2,H3…,Hn 。若小烈给第 j 位顾客上菜前刚刚为第 i 位顾客上菜,则第 j 位就会高兴,产生高兴指数 Wj=Hi×Hj 。这样,如果小烈按一定的方式调整上菜顺序,可以得到更高的高兴指数。现在小烈想知道用某一方法可达到的 n 位顾客高兴指数之和的最大值S 。因为顾客越高兴,给小烈的小费越多。第一位上菜的顾客不产生高兴值。

Input
第一行一个整数 n,顾客的数目。
第二行 n个数,第 i 个数表示第 i位顾客的开心值。各个数字用空格隔开。
Output
一个数 s,为高兴指数的最大值。
样例
Sample Input
3
7 1 9
Sample Output
72
Hint
样例解释:
从左往右上 1的菜,再上 9 的菜,高兴值是 0∗1+1∗9,从右往左走回来的时候上 7 的菜,高兴值是 7∗9,总的高兴值就是 7。
对于30%的数据 n≤9,n∈N+;
对于70%的数据 n≤1500,n∈N+;
对于100%的数据 n≤2500,n∈N+;
所有数字小于(含结果)2147483648;
思路
这道题有点像(方格取树)[https://www.cnblogs.com/soda-ma/p/13226890.html] ,这就启发我们将题目所描述的情形变成两个小烈同时从左边往右边走,容易看出,这样转化是等价的。同时,我们需要注意的是每个位置都必须送到,而且只能有两个小烈里面的其中一个送到。这样考虑之后,状态之间的转移关系就很显然了。f[i][j] 表示小烈 a 和小烈 b 分别走到了 i,j 位置,同时记 m=max(x1,x2),对于小于 m 的每一个位置都已经被送到。那么,在 f[i][j] 这一状态下,需要决定第 m+1 个人由谁来送菜。显然这是一个多阶段决策问题,m 就是阶段的标识。可以用动态规划求解。同时,可以发现,在第 m 个阶段通过决策转移到 m+1 个阶段是,每一个决定(小烈a来送还是小烈 b来送)都对应一个状态为:f[m+1][j] 和 f[i][m+1] 。因为在送的过程中,每个位置都需要送到,而且两个小烈都是一样的,所以,f[i][j]==f[j][i] 。这样,我们让小烈 a 始终在前面,小烈 b 在后面,即,f[i][j] 保证 i>j 。
- f[i+1][j]=max(f[i+1][j],f[i][j]+a[i]∗a[i+1]) ,i+1 由 i 转移过来
- f[i+1][i]=max(f[i+1][i],f[i][j]+a[j]∗a[i+1]),i+1 由 j 转移过来
附上代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2500+5;
int a[maxn],f[maxn][maxn];
int main(){
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
f[i+1][j]=max(f[i+1][j],f[i][j]+a[i]*a[i+1]);
f[i+1][i]=max(f[i+1][i],f[i][j]+a[j]*a[i+1]);
}
}
for(int i=0;i<n;i++)
ans=max(ans,f[n][i]+a[n]*a[i]);
printf("%d\n",ans);
}
线性DP之小烈送菜的更多相关文章
- 小烈送菜——奇怪的dp
小烈送菜 题目描述 小烈一下碰碰车就被乐满地的工作人员抓住了.作为扰乱秩序的惩罚,小烈必须去乐满地里的"漓江村"饭店端盘子. 服务员的工作很繁忙.他们要上菜,同时要使顾客们尽量高兴 ...
- 方格取数(简单版)+小烈送菜(不知道哪来的题)-----------奇怪的dp增加了!
一.方格取数: 设有N*N的方格图(N<=20),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A(1,1) 点出发,可以向下行走,也可以向右走,直到到达右下 ...
- [HNOI2009]双递增序列(洛谷P4728)+小烈送菜(内部训练题)——奇妙的dp
博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法 ...
- 线性dp
线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- 线性DP详解
顾名思义,线性DP就是在一条线上进行DP,这里举一些典型的例子. LIS问题(最长上升子序列问题) 题目 给定一个长度为N的序列A,求最长的数值单调递增的子序列的长度. 上升子序列B可表示为B={Ak ...
- 非常完整的线性DP及记忆化搜索讲义
基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- HDU 1069 Monkey and Banana(线性DP)
Description A group of researchers are designing an experiment to test the IQ of a monkey. They wi ...
随机推荐
- (前言一)HTTP报文
01 概述 客户端与服务器端之间的通信,通过HTTP协议,以HTTP报文的形式来实现数据的交互. HTTP报文是HTTP通信时发送的数据块,本文主要从以下几个方面介绍HTTP报文:HTTP报文结构.方 ...
- mysql基础之-mysql存储引擎概述(八)
0x01 mysql 存储引擎:存储引擎也通常被称作“表类型” mysql> show engines; --- 查看当前所有所支持的存储引擎 mysql> show table st ...
- virtualbox 基于nat模式搭建局域网并且和宿主机通信
1.VIRTUALbox 2.两台虚拟机,设置网络为DHCP方式 检查文件确认是dhcp模式不是的百度搜索修改:/etc/sysconfig/network-scripts/ifcfg-enps3(网 ...
- Ubuntu18.04下MySQL8.0和Navicat15的安装与使用
目录 一.MySQL8.0安装 二.Navicat安装并与MySQL连接 一.MySQL8.0安装 注意:若直接 sudo apt install mysql-server,你会发现安装后的版本是5. ...
- DS-4-单链表的各种插入与删除的实现
typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; 带头结点的按位序插入: //在第i个位置插入元素e bo ...
- C#数据结构与算法系列(五):常见单链表笔试
1.求单链表中有效节点个数 public static int GetLength(HeroNode headNode) { int length = ; var cur = headNode.Nex ...
- Android学习笔记BroadcastReceiver(广播接收者)
Android发送广播的过程 代码实现 MainActivity.java import androidx.appcompat.app.AppCompatActivity; import androi ...
- 【JMeter_10】JMeter逻辑控制器__ForEach控制器<ForEach Controller>
ForEach控制器<ForEach Controller> 业务逻辑: ForEach控制器一般与用户自定义变量/JDBC结果变量一起使用,可以认为他就是一种遍历型循环,该节点下的脚本内 ...
- python常见数据类型及操作方法
title: "python数据类型及其常用方法" date: 2020-04-21T10:15:44+08:00 可变数据类型:允许变量的值发生变化,即如果对变量进行append ...
- Machine Learning Note
[Andrew Ng NIPS2016演讲]<Nuts and Bolts of Applying Deep Learning (Andrew Ng) 中文详解:https://mp.weixi ...