洛谷P1220关路灯题解
此题是一个状态转移方程还算比较多的一个区间DP,这个题也能启示我们如果某个状态不能够很好地解决问题,那么不妨试试再加一维,而且如果转移顺序不确定的话,可以试试记忆化搜索,说不定就可以比较容易的写出状态转移方程和状态转移。
状态
如果我们要关掉\(i\)到\(j\)的灯,则最后一个关掉的灯就是\(i\)或者\(j\),我们设\(dp[i][j][0/1]\)分别表示最后一个关掉的灯是\(i\)还是\(j\),\(dp[i][j][0]\)一定是由\(dp[i+1][j][0/1]\)来转移过来的,所以我们就可以分类讨论,所以很容易得出
状态转移方程
dp[i][j][0] = min(dp[i][j][0], dp[i + 1][j][0] + (data[i + 1].pos - data[i].pos) * (data[n].sum - data[j].sum + data[i].sum));
dp[i][j][0] = min(dp[i][j][0], dp[i + 1][j][1] + (data[j].pos - data[i].pos) * (data[n].sum - data[j].sum + data[i].sum));
然后就可以按照区间DP的基本思路来求解了。
\(Code\)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
int n, c;
struct light {
int pow, pos, sum;
}data[100100];
int dp[1010][1010][3];
int main()
{
scanf("%d%d", &n, &c);
for (int i = 1; i <= n; i++)
scanf("%d%d", &data[i].pos, &data[i].pow), data[i].sum = data[i - 1].sum + data[i].pow;
memset(dp, 124, sizeof(dp));
dp[c][c][0] = dp[c][c][1] = 0;
for (int l = 2; l <= n; l++)
for (int i = 1; i + l - 1 <= n; i++)
{
int j = i + l - 1;
dp[i][j][1] = min(dp[i][j][1], dp[i][j - 1][0] + (data[j].pos - data[i].pos) * (data[n].sum - data[j - 1].sum + data[i - 1].sum));
dp[i][j][1] = min(dp[i][j][1], dp[i][j - 1][1] + (data[j].pos - data[j - 1].pos) * (data[n].sum - data[j - 1].sum + data[i - 1].sum)) ;
}
/*
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
printf("%d %d\n", dp[i][j][0], dp[i][j][1]);
*/
printf("%d", min(dp[1][n][0], dp[1][n][1]));
return 0;
}
洛谷P1220关路灯题解的更多相关文章
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 洛谷P1220 关路灯 题解 区间DP
题目链接:https://www.luogu.com.cn/problem/P1220 本题涉及算法:区间DP. 我们一开始要做一些初始化操作,令: \(p[i]\) 表示第i个路灯的位置: \(w[ ...
- 洛谷P1220 关路灯
洛谷1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关 ...
- 洛谷——P1220 关路灯
P1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉 ...
- 洛谷P1220 关路灯(区间dp)
关路灯 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯.为了给村里节 ...
- 洛谷 P1220 关路灯 (贪心+区间dp)
这一道题我一直在想时间该怎么算. 看题解发现有个隐藏的贪心. 路径一定是左右扩展的,左右端点最多加+1(我竟然没发现!!) 这个性质非常重要!! 因此这道题用区间dp f[i][j]表示关完i到j的路 ...
- 洛谷P1220关路灯[区间DP]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 洛谷P1220关路灯[区间DP 提前计算代价]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 洛谷P1220 关路灯【区间dp】
题目:https://www.luogu.org/problemnew/show/P1220 题意:给定n盏灯的位置和功率,初始时站在第c盏处. 关灯不需要时间,走的速度是1单位/秒.问把所有的灯关掉 ...
随机推荐
- 【20190407】JavaScript-indexOf方法解析
在JavaScript中,字符串类型String和数组类型Array都有indexOf()方法,虽然他们的作用都是返回传入元素在指定字符串或数组中的位置,但他们之间还是存在着一点点不同. Str.in ...
- idea软件破解汉化
→http://idea.lanyus.com/上可以找到最新的破解补丁,下载并放到软件的bin目录下 →更改bin目录下的两个文件:Idea.exe.vmoptions和Idea64.exe.vm ...
- it's time to change myself now (2018.10.31)
自16年从新屋熊职校毕业,入职深圳某厂从事云存储两年半了.两年半的时间很快,快的感觉一生都会飞快,两年多一直很忙,忙的几乎忘了自己是否正向改变过. 正向改变,or 积极改变,今年十一回家,与几个好友小 ...
- formatter的使用
1.目的 如图所示,实现行编辑栏中的编辑删除,以及在时间建议中显示上中下旬 可参考easyui官方文档中所写的关于datagrid列属性:http://www.jeasyui.net/plugins/ ...
- python离线安装包
一.用download命令离线下载包 *.whl , 这个方法好像python3.7以上才能用 那么我的requirement.txt内容就是: django==1.8.11 simplejson= ...
- Python总结(一)
从大学开始,就对python有了兴趣,毕业设计就是用python做的一个新闻爬取和关键字提取的程序.然而,毕业之后由于一直没有从事python相关的开发,所以就一直没有再使用,一直停留在偶尔看一些资料 ...
- day10-内置模块学习(一)
今日份目录 1.模块之间的相互调用 2.代码结构的标准化 3.os模块 4.sys模块 5.collection模块 开始今日份总结 开始今日份总结 1.模块之间的相互调用 由于一些原因,总是会调用别 ...
- Windows服务器环境下jenkins下载和安装
1.下载jenkins 在windows系统上搭建jenkins持续集成有两种方法:1.war文件,可以用tomcat或者java命令直接运行2.msi安装,作为系统服务后台运行 下载地址 https ...
- sigsuspend()阻塞:异步信号SIGIO为什么会被截胡?
关键词:fcntl.fasync.signal.sigsuspend.pthread_sigmask.trace events. 此文主要是解决问题过程中的记录,内容有较多冗余.但也反映解决问题中用到 ...
- 安装Laravel框架,利用composer
学一学PHP框架--Laravel的设计思想. 先安装Laravel: Laravel的文档很全:参考 http://www.golaravel.com/ 既然文档很全,就简单说下几个重点.以下以安装 ...