洛谷P1220 关路灯 题解 区间DP
2024-10-08 06:27:54
题目链接:https://www.luogu.com.cn/problem/P1220
本题涉及算法:区间DP。
我们一开始要做一些初始化操作,令:
- \(p[i]\) 表示第i个路灯的位置;
- \(w[i]\) 表示第i个路灯的功率;
- \(sum[i]\) 表示前i个路灯的总功率
我们设状态 \(f[l][r][i]\) 表示:
- 当 \(i=0\) 时,老张关了编号 \([l,r]\) 范围内的所有灯,并且此时老张在第 \(l\) 盏灯处(最左边)的最少消耗电量;
- 当 \(i=1\) 时,老张关了编号\([l,r]\) 范围内的所有灯,并且此时老张在第 \(r\) 盏灯处(最右边)的最少消耗电量。
则我们可以得出状态转移方程如下:
\[f[l][r][0] = min(f[l+1][r][0] + (sum[l] + sum[n] - sum[r]) * (p[l+1] - p[l]), f[l+1][r][1] + (sum[l] + sum[n] - sum[r]) * (p[r] - p[l]))
\]
\]
\[f[l][r][1] = min(f[l][r-1][0] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[l]),f[l][r-1][1] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[r-1]))
\]
\]
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
int n, c;
long long p[maxn], // p[i]表示第i个路灯的位置
w[maxn], // w[i]表示第i个路灯的功率
sum[maxn], // sum[i]表示前i个路灯的总功率
f[maxn][maxn][2]; // f[l][r][0]表示关了[l,r]范围内的灯并且当前在l位置的最小功率;
// f[l][r][1]表示关了[l,r]范围内的灯并且当前在r位置的最小功率
const long long INF = (1LL<<60);
int main() {
cin >> n >> c;
for (int i = 1; i <= n; i ++) {
cin >> p[i] >> w[i];
sum[i] = sum[i-1] + w[i];
}
for (int i = 1; i <= n; i ++)
for (int j = i; j <= n; j ++)
f[i][j][0] = f[i][j][1] = INF;
f[c][c][0] = f[c][c][1] = 0; // 一开始在第c盏路灯不消耗电量
for (int len = 2; len <= n; len ++) {
for (int l = max(1, c-len+1); l+len-1 <= n; l ++) {
int r = l+len-1;
f[l][r][0] = min(f[l+1][r][0] + (sum[l] + sum[n] - sum[r]) * (p[l+1] - p[l]),
f[l+1][r][1] + (sum[l] + sum[n] - sum[r]) * (p[r] - p[l]));
f[l][r][1] = min(f[l][r-1][0] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[l]),
f[l][r-1][1] + (sum[l-1] + sum[n] - sum[r-1]) * (p[r] - p[r-1]));
}
}
cout << min(f[1][n][0], f[1][n][1]) << endl;
return 0;
}
最新文章
- ASP.NET Core 中文文档 第三章 原理(8)日志
- PHP图片加文字水印和图片水印方法(鉴于李老师博客因没加水印被盗,特搜集的办法。希望能有用!)
- Python小练习五
- Android应用:横竖屏切换总结
- 用MathType编辑横三角形的方法
- Vim篇
- 不同浏览器对parseInt方法解析的不同
- javascript数组去重算法-----4
- 开源项目之Android Afinal框架
- Python--三元运算与lambda表达式
- Mysql中的in和find_in_set的区别?
- Asp.net MVC4高级编程学习笔记-视图学习第一课20171009
- Boost Coroutine2 - stackful coroutine简介
- 新概念英语(1-67)The weekend
- nginx正则匹配
- JetBrains系IDE的设置Pycharm PHPStorm
- [Swift]LeetCode309. 最佳买卖股票时机含冷冻期 | Best Time to Buy and Sell Stock with Cooldown
- kibana从入门到精通-Kibana安装
- $on在构造器外部添加事件(通过$emit进行外部调用)$once执行一次的事件(通过$emit进行外部调用)$off关闭事件
- ubuntu下安装、破解securtCRT工具
热门文章
- behavior planning——13. implement a cost function in C++
- SpringBoot 集成 Activiti 一路踩得坑
- 2019-8-31-jekyll-在博客添加流程图
- .net Framework 源代码 · ScrollViewer
- Python--day30--基于tcp协议的套接字socket
- 前端开发之HTML
- H3C DHCP特点
- 2019-4-10-win10-uwp-自定义标记扩展
- 【hdu 1850】Being a Good Boy in Spring Festival
- vue+element-ui实现分页