题目链接:传送门

题目大意:

  总共有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. 【转】关于TCP 半连接队列和全连接队列

    摘要: # 关于TCP 半连接队列和全连接队列 > 最近碰到一个client端连接异常问题,然后定位分析并查阅各种资料文章,对TCP连接队列有个深入的理解 > > 查资料过程中发现没 ...

  2. prefix word se sub suc sup suf sur out~s

    1★ se 区分开,分开 ,离开   2★ sub 接近,靠近,次一等 ,次的   3★ suc 4★ sup   5★ suf     6★ sur 在~下面    

  3. 用linux命令连接无线网络-转载

    首先是用到的工具: ifconfigrouteiwlistiwconfig 后两个是无线工具 从现在开始,按我的步骤做 (##后面的是说明部分) 1.开启无线,如果是笔记本,开启无线开关,或用Fn+F ...

  4. 阿里云免费申请https证书

    申请地址   https://common-buy.aliyun.com/?spm=a2c4e.11153940.blogcont65199.22.30f968210RsUSx&commodi ...

  5. 1-find

    查找算法 #include <stdio.h> #include <assert.h> #define FALSE 0 #if 1 //array method int fin ...

  6. learning ddr DLL-off mode

  7. gitblit系列七:使用Jenkins配置自动化持续集成构建

    1.安装 方法一: 下载jenkin.exe安装文件 下载地址:https://jenkins.io/content/thank-you-downloading-windows-installer/ ...

  8. vue-3-Class 与 Style 绑定

    对象语法: <div v-bind:class="{ active: isActive }"></div> <div class="stat ...

  9. 【转载二】Grafana系列教程–Grafana的下载及安装

    本篇教程,waitig 来为大家介绍一下Grafana的安装及运行的方式. 更多Grafana技术请加入<InfluxDB&Grafana技术交流群:580487672(点击加入)> ...

  10. 小程序之setData特殊情况 三种情况的wx:if

    比如data{ “a”:{}, "b":{} } 你想完成这样的结构 //创建一个对象 var readyData={} //对象[key] =另一个对象 readyData[ke ...