bzoj [POI2015]Myjnie
[POI2015]Myjnie
Time Limit: 40 Sec Memory Limit: 256 MBSec Special Judge
Description
有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。
若有多组最优解,输出任意一组。
Sample Input
7 5
1 4 7
3 7 13
5 6 20
6 7 1
1 2 5
Sample Output
43
5 5 13 13 20 20 13
这个区间dp有点东西。。。
离散化一下
f[l][r][t] 表示完全属于区间的人中最小值刚好是t的最优贡献。
g[l][r][t] 表示完全属于区间的人中最小值大于等于t的最优贡献。
然后你的转移就成了枚举最小值是哪个店。
f[l][r][t]=max(g[l][i-1][t]+g[i+1][r][t]+cost(i))
然而这个cost(i)有点尴尬。。。你可能还有有个预处理h[i][j]表示在处理当前这个dp区间的情况下,包含i这个位置的人且在最小值为j的情况下能给钱的人有多少个。。。
写吧~
1 mol 乱七八糟的错误。。。。。调一万年啊。。。。
```c++
include<bits/stdc++.h>
using namespace std;
const int maxm = 4004;
struct lpl{
int a, b, c;
}ini[maxm];
struct lpd{
int g, f, pos;
}dp[55][55][maxm];
int n, m, k, ans[55], pl[maxm], nam[maxm], mark[500005], h[55][maxm];
inline bool cmp(lpl A, lpl B) {return A.b == B.b ? A.a < B.a : A.b < B.b;}
inline void putit()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++i) scanf("%d%d%d", &ini[i].a, &ini[i].b, &ini[i].c), pl[i] = ini[i].c;
sort(ini + 1, ini + m + 1, cmp);
sort(pl + 1, pl + m + 1); k = 0;
for(int i = 1; i <= m; ++i)
if(pl[i] != pl[i - 1]){
k++; nam[k] = pl[i]; mark[pl[i]] = k;
}
for(int i = 1; i <= m; ++i) ini[i].c = mark[ini[i].c];
}
inline void workk()
{
for(int l = n; l >= 1; --l)
for(int r = l; r <= n; ++r){
for(int i = l; i <= r; ++i)
for(int j = 1; j <= k; ++j)
h[i][j] = 0;
for(int i = 1; i <= m && ini[i].b <= r; ++i){
if(ini[i].a < l) continue;
for(int j = ini[i].a; j <= ini[i].b; ++j) h[j][ini[i].c]++;
}
for(int i = l; i <= r; ++i)
for(int j = k - 1; j >= 1; --j)
h[i][j] += h[i][j + 1];
for(int i = l; i <= r; ++i)
for(int j = k; j >= 1; --j){
int tmp = dp[l][i - 1][j].g + dp[i + 1][r][j].g + h[i][j] * nam[j];
if(dp[l][r][j].f < tmp){
dp[l][r][j].f = tmp; dp[l][r][j].pos = i;
}
dp[l][r][j].g = max(dp[l][r][j].f, dp[l][r][j + 1].g);
}
}
}
void dfs(int l, int r, int t)
{
if(l > r) return;
if(dp[l][r][t].g == 0){
for(int i = l; i <= r; ++i) ans[i] = nam[t];
return;
}
for(int i = t; i <= k; ++i){
if(dp[l][r][t].g == dp[l][r][i].f){
int now = dp[l][r][i].pos;
ans[now] = nam[i];
dfs(l, now - 1, i); dfs(now + 1, r, i);
break;
}
}
}
inline void print()
{
printf("%d\n", dp[1][n][1].g);
dfs(1, n, 1);
for(int i = 1; i <= n; ++i) printf("%d ", ans[i]);
}
int main()
{
putit();
workk();
print();
return 0;
}
bzoj [POI2015]Myjnie的更多相关文章
- 【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)
4380: [POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗 ...
- [POI2015]Myjnie
[POI2015]Myjnie 题目大意: 有\(n(n\le50)\)家洗车店从左往右排成一排,每家店都有一个正整数价格\(d_i\). 有\(m(m\le4000)\)个人要来消费,第\(i\)个 ...
- 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[ ...
- 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
链接 BZOJ 4380 题面 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]. 有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个 ...
- 【BZOJ】4380: [POI2015]Myjnie
题解 区间dp,先离散化所有价值 \(f[i][j][k]\)表示\([i,j]\)区间里最小值为\(k\)的价值最大是多少 只考虑\(i <= a <= b <= j\)的区间,枚 ...
- @bzoj - 4380@ [POI2015] Myjnie
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 n 家洗车店从左往右排成一排,每家店都有一个正整数价格 p[ ...
- BZOJ4380 : [POI2015]Myjnie
将$c$离散化,设: $f[i][j][k]$为区间$[i,j]$最小值为$k$的最大收益. $g[i][j][k]$为$\max(g[i][j][k..m])$. $h[i][j]$为对于当前DP区 ...
随机推荐
- python 批量爬取四级成绩单
使用本文爬取成绩大致有几个步骤:1.提取表格(或其他格式文件——含有姓名,身份证等信息)中的数据,为进行准考证爬取做准备.2.下载准考证文件并提取出准考证和姓名信息.3.根据得到信息进行数据分析和存储 ...
- MyBatis中XML 映射配置文件的简单介绍
官网写的比较具体,可以查看以下的网站: http://www.mybatis.org/mybatis-3/zh/configuration.html 另外,实际用到标准的CRUD的操作和查询列表, & ...
- 小程序中this.setData的使用和注意事项
前言:微信小程序中经常需要用到this.setData({})把变量值渲染到视图层,那到底什么是this.setData,如何使用?需要注意哪些?作为一个初学者,分享一点我的经验,希望大家批评指正. ...
- Dubbox管理中心的部署及使用
安装: 我们在开发时,需要知道注册中心都注册了哪些服务,以便我们开发和测试.我们可以通过部署一个管理中心来实现.其实管理中心就是一个web应用,部署到tomcat即可. (1)编译源码,得到war包 ...
- 从零开始做一个Android自动化
移动端自动化简单说就是,写好操作app的程序,运行起来,自动执行程序和测试用例,输出执行结果,结果正确,测试通过. 自动化可以方便地完成安装/卸载.启动/运行.UI适配等环节,节省时间: 同一测试脚本 ...
- jQuery遍历之向上遍历
1.parent $(document).ready(function(){ $("a").parent().css({border:"4px solid black&q ...
- qt学习 (五) 登陆界面之连接按钮
登陆步骤是比对输入的账号密码与数据库中的表项目是否一致 一样, 跳出mainwidget对话框 不一样,跳出消息错误框 今天就是要进去, 因为进去以后是widget的窗口,所以把用来核对消息的数据库 ...
- 洛谷 P1271 聚会的快乐(树状dp)
题目描述 你要组织一个由你公司的人参加的聚会.你希望聚会非常愉快,尽可能多地找些有趣的热闹.但是劝你不要同时邀请某个人和他的上司,因为这可能带来争吵.给定N个人(姓名,他幽默的系数,以及他上司的名字) ...
- Vue - 前端本地项目开发过程中webpack打包内存泄漏问题解决方法
编译项目出现如下错误: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 原因: n ...
- 2019 牛客暑期多校 第一场 H XOR (线性基)
题目:https://ac.nowcoder.com/acm/contest/881/H 题意:求一个集合内所有子集异或和为0的长度之和 思路:首先集合内异或和,这是线性基的一个明显标志,然后我们不管 ...