如此可爱的动态规划见过么?

  相信各位都非常喜欢动态规划,那我就写一道可爱的动态规划的题解吧。

题目:https://www.luogu.com.cn/problem/P5774

题意:

  题意“挺明白”的。。。题意:给你一个序列每个数表示第i个村庄一天要因感染而死的人数,大佬你能治这种病,花费一天治好一个村庄,而你移动还要花费一天,问治愈好所有村庄最少死的人。限制:只要从i走到i-1,就必须把i之前的所有村庄全部治愈。

分析:

  这题很容易看出是动态规划,但是,怎么规划呢(要求时间效率n方),暴力规划n3,我们并不能很好的解决它,那咋办:单调队列??,好像没啥单调。。。我们只能想别的办法:二分答案??,好像也不是很好判断死多少人可以完成,还是要回到动态规划。

  枚举长度,起点,断点三个是不行的,那我们可不可考虑先维护2个?

  我们先枚举起点和长度:那我们怎么做才能不用枚举断点呢?——加限制:我们定义Dp[i][j]表示治愈好i到j所有人过程中i到j中的死亡的最少人数,并且要求路线是i到j到i,于是,我们就可不枚举断点了,为什么呢:想一想,我们限制路线之后,Dp[i][j]的转移就不由得你去枚举断点了

  然后想出转移方程(这个就推导一下就好了,关键是怎么n3变n2

  Dp[i][j]=Dp[i+1][j]+min((sum[j]-sum[i])*2,a[i]*(d-1)*3+sum[j]-sum[i]);

  可是显然Dp[i][n]并不是我们最后想要的结果,因为我们并不一定要1到n到1,中间可以回头。

  不过没关系,我们已经成功一半了,我们再定义一个数组dp[i]表示前i个村庄被治愈之后,1到n总共最少死的人数,你会发现:不用枚举起点,太棒了,只要想出转移方程来就可以了:

  dp[i]=min(dp[j]+Dp[j+1][i]+(4*(i-j)-2)*(sum[n]-sum[i]))(j属于n*,j<i)

  最后,显然Dp[n]就是我们想要的答案了。

  很可爱的动态规划,大家是不是更爱动态规划了呢?

代码:

  又是极度的简单

#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int maxn=+;
long long a[maxn],sum[maxn],Dp[maxn][maxn],dp[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-]+a[i];
}
for(int d=;d<=n;d++)
for(int i=,j;(j=i+d-)<=n;i++)
Dp[i][j]=Dp[i+][j]+min((sum[j]-sum[i])*(long long),a[i]*(long long)(d-)*(long long)+sum[j]-sum[i]);
memset(dp,0x3f,sizeof(dp));
dp[]=;
for(int i=;i<=n;i++)
for(int j=;j<i;j++)
dp[i]=min(dp[i],dp[j]+Dp[j+][i]+((long long)*(long long)(i-j)-(long long))*(sum[n]-sum[i]));
printf("%lld",dp[n]);
return ;
}

没注释,各位大佬应该一看就懂

槽点:

  死亡人数用long long,你在逗我。。。

精华:

  多分析,可尝试动态规划多次:像本题一次区间规划,一次线性规划。

我们是:OIer~~~,我们要:Ac~~~,我们需:加油~~~!!!

洛谷P5774,可爱的动态规划。的更多相关文章

  1. 洛谷P1280 && caioj 1085 动态规划入门(非常规DP9:尼克的任务)

    这道题我一直按照往常的思路想 f[i]为前i个任务的最大空暇时间 然后想不出来怎么做-- 后来看了题解 发现这里设的状态是时间,不是任务 自己思维还是太局限了,题做得太少. 很多网上题解都反着做,那么 ...

  2. 洛谷 P1464 Function【动态规划(递推)/记忆化搜索(递归)】

    题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...

  3. 洛谷P1136 迎接仪式 动态规划

    显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...

  4. 洛谷P2196 && caioj 1415 动态规划6:挖地雷

    没看出来动规怎么做,看到n <= 20,直接一波暴搜,过了. #include<cstdio> #include<cstring> #include<algorit ...

  5. 洛谷P1385 密令 题解 动态规划

    题目链接:https://www.luogu.com.cn/problem/P1385 题目大意: 给定一小写字母串s,每次操作你可以选择一个p(1<=p<|s|)执行下述修改中的任意一个 ...

  6. 洛谷 CF1012C Hills (动态规划)

    题目大意:有n个山丘 , 可以在山丘上建房子 , 建房子的要求是 : 该山丘的左右山丘严格的矮于该山丘 (如果有的话),你有一架挖掘机,每单位时间可以给一个山丘挖一个单位的高度,问你想要建造 1,2, ...

  7. 洛谷 CF1012C Hills(动态规划)

    题目大意: 有几座山,如果一座山左右两边的山比它矮,那么可以在这个山上建房子,你有一台挖掘机,每天可以挖一座山一米,问你需要花多少代价可以分别盖1.2.3--座房子.(给出山的数量,以及每座山的高度) ...

  8. 【洛谷P4933 大师】动态规划

    题目描述 ljt12138首先建了n个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为1到n,第i个电塔的高度为h[i]. 建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去.这时候,如果留在 ...

  9. 洛谷教主花园dp

    洛谷-教主的花园-动态规划   题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价 ...

随机推荐

  1. Mybatis缓存及延迟加载策略

    一:引言 通过前面几篇的文章介绍了Mybatis的一对一.一对多.多对多关系的配置及实现,可是大家发现了吗?在执行关联查询的时候,直接会把当前查询的主表里包含的副表也查询后封装到对象里,其实在实际开发 ...

  2. redis 分布式锁的简单使用

    RedisLock--让 Redis 分布式锁变得简单 目录 1. 项目介绍 2. 快速使用 2.1 引入 maven 坐标 2.2 注册 RedisLock 2.3 使用 3. 参与贡献 4. 联系 ...

  3. mysql基础-新版5.7.10源码安装-记录(一)

    0x01 MySQL 从 5.5 版本开始,通过 ./configure 进行编译配置方式已经被取消,取而代之的是 cmake 工具 引用一句话 cmake的重要特性之一是其独立于源码(out-of- ...

  4. 由软件构造引申的OOP与POP的心得体会

    在大一初学C语言的时候,所解决的问题都是一些轻量级的简单问题,当时写过一个教学管理系统.这个教学管理系统的功能很简单,思想就是“流水线”:按部就班的实现所有流程.要完成整个教学管理系统,实际上就是完成 ...

  5. 【leetCode】485. 最大连续1的个数

    给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意: 输入的数组只包含 ...

  6. 【Transferable NAS with RL】2018-CVPR-Learning Transferable Architectures for Scalable Image Recognition

    Transferable NAS with RL 2018-CVPR-Learning Transferable Architectures for Scalable Image Recognitio ...

  7. Laravel中Homestead添加多站点时遇到问题

    Homestead做Laravel的开发还是很方便的,但是在添加多站点的时候,发现几个坑,来做个记录. 首先,官方文档给了修改homestead.yaml文件的方式,只需要在sites字节下添加一个新 ...

  8. pip应用实例

    homepage 目录 1. 安装 1.1. 指定版本 1.2. 用户权限 1.3. 读取requirments.txt 1.4. 不使用缓存文件 1.5. 指定extras_require 2. 镜 ...

  9. 代码点(code point)和代码单元(code units)

    1. 解释一 char:Java中,char类型为16个二进制位,原本用于表示一个字符.但后来发现,16位已经不够表示所有的字符,所以后来发展出了代码点表示字符的方法. 代码点(code point) ...

  10. Java 设置PDF平铺图片背景(水印)

    一.概述及环境准备 本文介绍使用免费版PDF库-Free Spire.PDF for Java加载图片来设置成PDF平铺图片背景的效果,也可以作为平铺图片水印来使用:编辑代码前,需要先导入jar文件, ...