BZOJ 4380 [POI2015]Myjnie | DP
链接
题面
有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]。
有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个进行一次消费。但是如果这个最便宜的价格大于c[i],那么这个人就不洗车了。
请给每家店指定一个价格,使得所有人花的钱的总和最大。
Input
第一行包含两个正整数n,m(1<=n<=50,1<=m<=4000)。
接下来m行,每行包含三个正整数a[i],b[i],ci
Output
第一行输出一个正整数,即消费总额的最大值。
第二行输出n个正整数,依次表示每家洗车店的价格p[i],要求1<=p[i]<=500000。
若有多组最优解,输出任意一组。
题解
这道题……是一个正常的(?)区间DP。
先将所有c[i]离散化。
f[i][j][k]表示区间[i, j]内的店、最低价格为k,能取到的最大价值。这个最大价值包括所有“完全包含在[i, j]”内的顾客提供的价值。
g[i][j][k]表示区间[i, j]内的店、最低价格>=k,能取到的最大价值。
转移的时候,枚举最低价格k所在的位置p,采取类似分治的思想,设完全包含在[i, j]内、横跨位置p、且c[i] >= k的顾客有cnt[p][k]个,那么有:
\]
这个cnt数组在每次枚举[i, j]的时候都预处理一下。
因为要输出方案,所以额外记录一下最优解都是在哪里取到的,最后dfs求出方案。
总复杂度是\(O(n^3m)\)。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define enter putchar('\n')
#define space putchar(' ')
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 52, M = 4002;
int n, m, a[M], b[M], c[M], cnt[N][M], ans[N], lst[M], idx, f[N][N][M], g[N][N][M], gk[N][N][M];
short fp[N][N][M];
void dfs(int l, int r, int k){
int val = gk[l][r][k], pos = fp[l][r][val];
ans[pos] = lst[val];
if(pos > l) dfs(l, pos - 1, val);
if(pos < r) dfs(pos + 1, r, val);
}
int main(){
read(n), read(m);
for(int i = 1; i <= m; i++)
read(a[i]), read(b[i]), read(c[i]), lst[i] = c[i];
sort(lst + 1, lst + m + 1);
idx = unique(lst + 1, lst + m + 1) - lst - 1;
for(int i = 1; i <= m; i++)
c[i] = lower_bound(lst + 1, lst + idx + 1, c[i]) - lst;
for(int i = n; i; i--)
for(int j = i; j <= n; j++){
for(int k = 1; k <= idx; k++)
for(int h = i; h <= j; h++)
cnt[h][k] = 0;
for(int k = 1; k <= m; k++)
for(int h = i; h <= j; h++)
if(a[k] >= i && a[k] <= h && b[k] >= h && b[k] <= j)
cnt[h][c[k]]++;
for(int h = i; h <= j; h++)
for(int k = idx; k; k--)
cnt[h][k] += cnt[h][k + 1];
for(int k = 1; k <= idx; k++)
for(int p = i; p <= j; p++)
if(g[i][p - 1][k] + g[p + 1][j][k] + lst[k] * cnt[p][k] >= f[i][j][k])
fp[i][j][k] = p, f[i][j][k] = g[i][p - 1][k] + g[p + 1][j][k] + lst[k] * cnt[p][k];
for(int k = idx; k; k--){
if(g[i][j][k + 1] > f[i][j][k])
gk[i][j][k] = gk[i][j][k + 1], g[i][j][k] = g[i][j][k + 1];
else
gk[i][j][k] = k, g[i][j][k] = f[i][j][k];
}
}
write(g[1][n][1]), enter;
dfs(1, n, 1);
for(int i = 1; i <= n; i++)
write(ans[i]), i == n ? enter: space;
return 0;
}
BZOJ 4380 [POI2015]Myjnie | DP的更多相关文章
- @bzoj - 4380@ [POI2015] Myjnie
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 n 家洗车店从左往右排成一排,每家店都有一个正整数价格 p[ ...
- 【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)
4380: [POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗 ...
- bzoj4380[POI2015]Myjnie dp
[POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 368 Solved: 185[S ...
- 【BZOJ】4380: [POI2015]Myjnie
题解 区间dp,先离散化所有价值 \(f[i][j][k]\)表示\([i,j]\)区间里最小值为\(k\)的价值最大是多少 只考虑\(i <= a <= b <= j\)的区间,枚 ...
- BZOJ 4380 Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【BZOJ4380】[POI2015]Myjnie 区间DP
[BZOJ4380][POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[ ...
- bzoj [POI2015]Myjnie
[POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special Judge Description 有n家洗车店从左往右排成一排, ...
- [POI2015]Myjnie
[POI2015]Myjnie 题目大意: 有\(n(n\le50)\)家洗车店从左往右排成一排,每家店都有一个正整数价格\(d_i\). 有\(m(m\le4000)\)个人要来消费,第\(i\)个 ...
- bzoj 4386: [POI2015]Wycieczki
bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...
随机推荐
- 2017-2018-2 《网络对抗技术》20155322 Exp8 web基础
[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-Web前端HTML 2.2-Web前端javascipt 2.3-Web后端 2.4 ...
- jsp页面中日期的格式化
在一次开发中,由于数据库中生日采用的是datetime的数据类型,因此数据库中数据格式为:2017-07-11 00:00:00. 但是,编辑页面中回显生日肯定是不可以显示出时分秒的, ...
- asp.net mvc2+nhibernate实体类映射问题之“尝试创建Controller类型的控制器时出错请确保控制器具有无参数公共构造函数”
程序出了问题,解决后发现如此简单,犯的错误是如此的低级啊,特此记录! 运行程序总是在浏览器中看到一片空白,什么也没有,用application_error跟踪发现抓出一个这样的异常 然后浏览器中就是这 ...
- mysql基础(一)——表、索引、视图
SQL语句不区分大小写 创建数据库 create database myData 删除数据库 drop database myData 创建表 create table company ( code ...
- flask入门小方法
我是在pycharm中写的.那么需要在Termainal中cd 到当前文件所在的文件夹,在运行python py文件名 一开始想用面向对象的方法来封装这些小模块,但发现在面向对象中要用到类属性,以及类 ...
- Inno Setup脚本
某天夜晚一场狂风暴雨,由于办公室座位旁的窗户没关,笔记本电脑泡了一夜水,无法开机,无奈送修,里面的大量资料也不知道会不会丢失. is的脚本只有重新写了,重新研究了一下检测程序是否正在运行的判断方法,另 ...
- python基础面试题
函数1def foo(arg,li=[]): li.append(arg) return li list1 = foo(21) list2 = foo(11,[2]) list3 = foo(28) ...
- openstack horizon 开发第二天
依照上次的简单的仪表盘添加动作额外添加或修改的文件mydashboard/├── mypanel│ ├── forms.py│ ├── tables.py│ ├── templates│ ...
- mac 安装 tomcat 配置
前面的话:记录下 Mac 安装配置 Tomcat 过程 1. 下载安装 Tomcat 下载 Tomcat 地址(官方地址):https://tomcat.apache.org/download-80. ...
- webpack简单原理及用法
前言 如果你已经对Webpack精通了或者至少一直在工作中使用它,请关闭当前浏览器标签,无视这篇文章. 这篇文章本意是写给我自己看的,作为一篇Cookbook供快速查询和上手用.原因是虽然工作中会涉及 ...