题目链接:传送门

题目大意:

  总共有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)的更多相关文章

  1. P1220 关路灯——区间dp

    P1220 关路灯 题目描述 某一村庄在一条路线上安装了 \(n\) 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一 ...

  2. P1220 关路灯 区间dp

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  3. 洛谷 P1220 关路灯 区间DP

    题目描述 某一村庄在一条路线上安装了 n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了 ...

  4. 洛谷P1220关路灯——区间DP

    题目:https://www.luogu.org/problemnew/show/P1220 区间DP. 代码如下: #include<iostream> #include<cstd ...

  5. 洛谷P1220关路灯[区间DP]

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  6. 洛谷P1220关路灯[区间DP 提前计算代价]

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  7. luogu1220_关路灯 区间dp

    传送门 区间dp f[i][j][state] : [i, j]区间 state=0 当前选i state = 1 当前选j 注意枚举的顺序 转移的设计时 在同时刻不在[i,j]区间里的数也要考虑 不 ...

  8. luogu 1220 关路灯 区间dp

    Code: #include <bits/stdc++.h> #define ll long long #define N 1003 #define setIO(s) freopen(s& ...

  9. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  10. 洛谷——P1220 关路灯

    P1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉 ...

随机推荐

  1. Oracle 如何循环查询结果集,进行新增或修改

    Oracle的PL/SQL中怎样循环查询的结果集,然后根据查询结果进行判断,是新增或修改操作 loop循环例子 for item in (select a,b,c from table_a where ...

  2. sqlcipher 数据库解密

    使用 sqlcipher.exe 可以在输入密码后,查看加密数据库的内容. 但是要编码查询数据库的内容,还要另寻方法.(相关的工具和库在我的百度网盘中) 使用sqlcipher windows 命令工 ...

  3. 用c++写一个数据库

    [cpp] view plain copy 第一步:构建一个头文件(**.h) [cpp] view plain copy #include<iostream> #include<i ...

  4. bzoj2330

    题解: 差分约束系统 要我们求最小值 显然就是转化为最长路 然后spfa一下即可 代码: #include<bits/stdc++.h> using namespace std; ; lo ...

  5. day3-PyCharm 断点 调试模式

    上篇学习了Python的工具选择,PyCharm的基本设置,简单的了解了下PyCharm的调试模式,今天主要学习下PyCharm的调式模式,在以后的开发中是一个非常重要的工具. [运行]和[调试]前的 ...

  6. OO第一次课程总结分析

    作为一个之前从未使用过java语言,主攻面向过程式编程的“面向对象”小白,于是乎从第一次作业开始时利用时间疯狂学习java语言,经过三次作业的残酷洗礼,自己对面向对象式编程多多少少有了初步的了解(前路 ...

  7. 经典DFS问题实践

    八皇后问题: //八皇后问题 经典的DFS问题实践 #include<iostream> #include<cmath> #include<algorithm> # ...

  8. pytorch加载和保存模型

    在模型完成训练后,我们需要将训练好的模型保存为一个文件供测试使用,或者因为一些原因我们需要继续之前的状态训练之前保存的模型,那么如何在PyTorch中保存和恢复模型呢? 方法一(推荐): 第一种方法也 ...

  9. MeshLab 编译

    1.需要以下:  MeshLab 1.3.3  下载地址 http://sourceforge.net/projects/meshlab/files/meshlab Win7 X64  Visual ...

  10. SQL-8 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

    题目描述 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示CREATE TABLE `salaries` (`emp_n ...