线性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 ...
随机推荐
- 循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数
在我们使用VUE+Element 处理界面的时候,往往碰到需要利用JS集合处理的各种方法,如Filter.Map.reduce等方法,也可以设计到一些对象属性赋值等常规的处理或者递归的处理方法,以前对 ...
- 深入剖析AQS
目录 摘要 AbstractQueuedSynchronizer实现一把锁 ReentrantLock ReentrantLock的特点 Synchronized的基础用法 ReentrantLock ...
- ASP.NET Core通过Nacos SDK读取阿里云ACM
背景 前段时间,cranelee 在Github上给老黄提了个issues, 问到了如何用Nacos的SDK访问阿里云ACM. https://github.com/catcherwong/nacos ...
- 网络编程-Netty-Reactor模型
目录 # 摘要 高性能服务器 Reactor模式 Reactor单线程模型设计 Reactor多线程模型设计 主从Reactor多线程模型设计 Netty Reactor模型设计 参考 你的鼓励也是我 ...
- python中turtle模块画正多边形
画正多边形主要是计算多边形每个角度对应的外角的度数,计算出来这个度数即可画图,相对来说非常简单 以正六边形为例 import turtle import time t = turtle.Pen() f ...
- MySQL数据库几种常用的索引类型使用介绍
一.简介 MySQL目前主要有以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 二.语句 1 2 CREATE TABLE table_name[col_nam ...
- Tensorflow 中(批量)读取数据的案列分析及TFRecord文件的打包与读取
内容概要: 单一数据读取方式: 第一种:slice_input_producer() # 返回值可以直接通过 Session.run([images, labels])查看,且第一个参数必须放在列表中 ...
- selenium3.0-selenium发展史
- mybatis读写分离
mybatis读写分离实现方式有很多种,当然如果没有太过复杂的处理,可以使用阿里云数据库自带的读写分离连接,那样会更加简洁.本文主要对mybatis实现读写分离.主要的实现方式有一下四种: 方案1 通 ...
- vue通过属性绑定为元素绑定style行内样式
1.直接在元素上通过:style绑定书写 <h1 :style="{color: 'red','font-size': '40px'}">这是一 ...