线性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 ...
随机推荐
- npm run dev启动项目,electron提示throw new Error('Electron failed to install correctly, please delete node_modules/electron and try installing again')
npm run dev 项目,提示 throw new Error('Electron failed to install correctly, please delete node_modules/ ...
- JAVA第三次blog总结
JAVA第三次blog总结 0.前言 这是我们在博客园上第三次写博客,也是本学期最后一次的JAVA学习大总结.现在我们的JAVA已经接近尾声了,对于编程思想和方法的改变依旧是难点,但是经过这一段时间的 ...
- Magic Line【坐标点排序方法】
Magic Line 题目链接(传送门) 来源:牛客网 题目描述 There are always some problems that seem simple but is difficult to ...
- DML_Data Modification_DELETE
DML_Data Modification_Delete删除记录比较简单,但是需要特别注意,一不小心,就变成了 “从删库到跑路“ 就掉的大了 /* Microsoft SQL Server 2008 ...
- elasticsearch unassigned shards 导致RED解决
先通过命令查看节点的shard分配整体情况 curl -X GET "ip:9200/_cat/allocation?v" 说明:有16个索引未分片 2.查看未分片的索引 curl ...
- cb44a_c++_STL_算法_删除_(2)remove_copy_remove_copy_if
cb44a_c++_STL_算法_删除_(2)remove_copy_remove_copy_if remove_copy()//在复制过程中删除一些数据remove_copy_if() 删除性算法: ...
- Jmeter(十二) - 从入门到精通 - JMeter逻辑控制器 - 终篇(详解教程)
1.简介 Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”. 意思 ...
- vue学习第二天:Vue跑马灯效果制作
分析: 1. 给开始按钮绑定一个点击事件 2.在按钮的事件处理函数中,写相关的业务代码 3.拿到msg字符串 4.调用字符串的substring来进行字符串的截取操作 5.重新赋值利用vm实例的特性来 ...
- 史上最经典的git教程
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wsyht90.blog.51cto.com/9014030/1832284 文档 ...
- redis高级命令4 持久化机制 、事务
redis的事务是支持很简单,基本没有啥用我们来看下面的列子 我们开启一个事务,在事务中执行了age 加1,set a4 ,还有对一个字符串进行加一,对字符串加1导致了事务失败,按道理incr age ...