P1220 关路灯 (区间dp)
题目链接:传送门
题目大意:
总共有N盏灯,老张从点C(1 ≤ C ≤ N)开始关灯(关灯不需要等待时间,C点的灯直接关掉),与此同时灯开始烧电(已知功率Pi)。
老张每次可以往左走关最近的灯或者往右走关掉最近的灯,耗时等于距离。问最少的烧电量。
1 ≤ N ≤ 50。
思路:
状态:
f[i][j]表示在已经关掉i,i+1,…,j的灯时已经浪费的电量。
讨论发现如果要转移状态,还需要加一维表示老站当前的位置:
f[i][j][0]表示老张在位置i,f[i][j][1]表示老张在位置j;
初始状态:
f[C][C][0] = f[C][C][1] = 0;
老张一开始可以直接关掉C点的灯。
状态访问顺序:
更新f[i][j]的时候需要知道f[i+1][j]和f[i][j-1]的状态。
也就是说从C点开始向两边访问即可。
状态转移方程:
f[i][j][0] = max(f[i+1][j][0] + 从点i+1走到点i所花费的时间 * 还没关掉的灯的总功率,
f[i+1][j][1] + 从点j走到点i所花费的时间 * 还没关掉的灯的总功率)
f[i][j][1] = max(f[i][j-1][0] + 从点i走到点j所花费的时间 * 还没关掉的灯的总功率,
f[i][j-1][1] + 从点j-1走到点j所花费的时间 * 还没关掉的灯的总功率)
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAX_N = ;
const ll INF = 0x3f3f3f3f3f3f3f3f; int N, C;
int pos[MAX_N];
ll P[MAX_N], sum[MAX_N], f[MAX_N][MAX_N][];// 0 表示停在左端,1 表示停在右端 void dp()
{
for (int i = C; i >= ; i--) {
for (int j = C; j <= N; j++) {
if (i == C && j == C) {
f[i][j][] = f[i][j][] = ;
continue;
}
// (i+1, j) -> (i, j)
if (i+ <= C) {
if (f[i][j][] > f[i+][j][] + (pos[i+] - pos[i]) * (sum[N] - sum[j] + sum[i])) {
f[i][j][] = f[i+][j][] + (pos[i+] - pos[i]) * (sum[N] - sum[j] + sum[i]);
}
if (f[i][j][] > f[i+][j][] + (pos[j] - pos[i]) * (sum[N] - sum[j] + sum[i])) {
f[i][j][] = f[i+][j][] + (pos[j] - pos[i]) * (sum[N] - sum[j] + sum[i]);
}
}
// (i, j-1) -> (i, j)
if (j- >= C) {
if (f[i][j][] > f[i][j-][] + (pos[j] - pos[i]) * (sum[N] - sum[j-] + sum[i-])) {
f[i][j][] = f[i][j-][] + (pos[j] - pos[i]) * (sum[N] - sum[j-] + sum[i-]);
}
if (f[i][j][] > f[i][j-][] + (pos[j] - pos[j-]) * (sum[N] - sum[j-] + sum[i-])) {
f[i][j][] = f[i][j-][] + (pos[j] - pos[j-]) * (sum[N] - sum[j-] + sum[i-]);
}
}
}
}
cout << min(f[][N][], f[][N][]) << endl;
return;
} int main()
{
cin >> N >> C;
sum[] = ;
for (int i = ; i <= N; i++) {
scanf("%d%lld", pos+i, P+i);
sum[i] = sum[i-] + P[i];
}
for (int i = C; i >= ; i--) {
for (int j = C; j <= N; j++) {
f[i][j][] = f[i][j][] = INF;
}
}
dp();
return ;
}
/*
4 3
2 10000
3 10
4 100
5 200 4 3
2 10000
3 200
4 100
5 10
*/
P1220 关路灯 (区间dp)的更多相关文章
- P1220 关路灯——区间dp
P1220 关路灯 题目描述 某一村庄在一条路线上安装了 \(n\) 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一 ...
- P1220 关路灯 区间dp
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 洛谷 P1220 关路灯 区间DP
题目描述 某一村庄在一条路线上安装了 n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了 ...
- 洛谷P1220关路灯——区间DP
题目:https://www.luogu.org/problemnew/show/P1220 区间DP. 代码如下: #include<iostream> #include<cstd ...
- 洛谷P1220关路灯[区间DP]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 洛谷P1220关路灯[区间DP 提前计算代价]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- luogu1220_关路灯 区间dp
传送门 区间dp f[i][j][state] : [i, j]区间 state=0 当前选i state = 1 当前选j 注意枚举的顺序 转移的设计时 在同时刻不在[i,j]区间里的数也要考虑 不 ...
- luogu 1220 关路灯 区间dp
Code: #include <bits/stdc++.h> #define ll long long #define N 1003 #define setIO(s) freopen(s& ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 洛谷——P1220 关路灯
P1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉 ...
随机推荐
- zabbix3.4.7安装在centos 7.4上
Centos 7.4 安装Zabbix 3.4 一.安装环境 1 [root@juny-18 ~]# cat /etc/redhat-release 2 3 CentOS Linux release ...
- [转载] C++ STL中判断list为空,size()==0和empty()有什么区别
关于两个的区别,首先size()==0为bool表达式,empty()为函数调用,这一点很明显.查看源代码, bool empty() const { return _M_node->_M_ne ...
- laravel在控制器中动态创建数据表
Schema::connection('usertable')->create('test', function ($table) { $table->increments('id'); ...
- shell IF分支判断语句
单分支IF条件语句 if [ 条件判断式 ] then 程序: fi //结束的时候if反过来写 fi ----------------------------- /** * if test -d ...
- html 多媒体使用
HTML插件 辅助应用程序(helper application)是由浏览器启动的程序,辅助应用程序也称为插件. 辅助应用程序可用于播放音频和视频(或其他 ).辅助程序是使用<Object> ...
- Win10系列:VC++ Direct3D模板介绍3
(4)Render函数 默认定义在CubeRenderer.cpp源文件中的Render函数用于绘制立体图形,此函数的实现代码如下所示: void CubeRenderer::Render() { ...
- Win10系列:JavaScript 控件的使用
向页面中添加的控件可分为两种类型:标准的HTML控件和WinJS库控件.其中标准的HTML控件是指HTML标准中定义的基本控件,如按钮和复选框:WinJS库控件是为开发基于JavaScript 的Wi ...
- learning ddr mode reigsters
For application flexibility, various functions, features, and modes are programmable in four Mode Re ...
- 类型重命名 typedef
所谓数据重命名就是给数据类型起一个新的名字,比如int 这个数据类型,可以给他起一个新的名字叫 my int.他俩的用法.特点.属性等是一模一样,仅仅名字不同而已. 作用:1,增加代码的可读性.2,让 ...
- Spring-data-JPA详细介绍
Spring-data-JPA学习: 1. https://blog.csdn.net/liujianwd/article/details/75411009 2.http://www.cnblogs. ...