[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的更多相关文章

  1. 【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)

    4380: [POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗 ...

  2. [POI2015]Myjnie

    [POI2015]Myjnie 题目大意: 有\(n(n\le50)\)家洗车店从左往右排成一排,每家店都有一个正整数价格\(d_i\). 有\(m(m\le4000)\)个人要来消费,第\(i\)个 ...

  3. BZOJ 4380 Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  4. 【BZOJ4380】[POI2015]Myjnie 区间DP

    [BZOJ4380][POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[ ...

  5. bzoj4380[POI2015]Myjnie dp

    [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 368  Solved: 185[S ...

  6. BZOJ 4380 [POI2015]Myjnie | DP

    链接 BZOJ 4380 题面 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]. 有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个 ...

  7. 【BZOJ】4380: [POI2015]Myjnie

    题解 区间dp,先离散化所有价值 \(f[i][j][k]\)表示\([i,j]\)区间里最小值为\(k\)的价值最大是多少 只考虑\(i <= a <= b <= j\)的区间,枚 ...

  8. @bzoj - 4380@ [POI2015] Myjnie

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 n 家洗车店从左往右排成一排,每家店都有一个正整数价格 p[ ...

  9. 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区 ...

随机推荐

  1. 在Ubuntu custom kernel上裝perf by compile

    Using perf, the Linux Performance Analysis tool on Ubuntu Karmic A lot has been going on with Linux ...

  2. 自增主键与UUID的优缺点

    自增主键 自增ID是在设计表时将id字段的值设置为自增的形式,这样当插入一行数据时无需指定id会自动根据前一字段的ID值+1进行填充.在MySQL数据库中,可通过sql语句AUTO_INCREMENT ...

  3. UML 简介

    虚线箭头指向依赖: 实线箭头指向关联: 虚线三角指向接口: 实线三角指向父类: 空心菱形能分离而独立存在,是聚合: 实心菱形精密关联不可分,是组合:

  4. MYSQL全文索引—CONTAINS语法

    我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search con ...

  5. 交叉编译fw_printenv

    source /opt/poky/environment... 创建交叉编译环境. 更改u-boot/tools/env/Make 添加CC 9 CC=aarch64-poky-linux-gcc - ...

  6. 【dart学习】-- Dart之异步编程

    一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...

  7. layui多图上传加隐藏域

    我的情况是,通过layui上传图片调用后端,后端将图片上传后返回图片路径,上传成功后将图片在页面显示出来(避免用户网速不稳定,图片其实还没上传成功就进行下一步操作),然后同步每个图片增加隐藏域,最终表 ...

  8. [jzoj5840]Miner 题解(欧拉路)

    首先考虑第一问.每个联通块的情况是相对独立的,所以可以分别求每个联通块的答案.无向图中存在欧拉路的条件是奇点数为0或2,那么合法方案肯定是tp到一个奇点,通过一条欧拉路到另一个奇点,再tp到另一个奇点 ...

  9. vue 微信公众号分享后支付失效页面URL不变的坑

    微信分享后支付页面还是初始页面,这个问题解决了, created(){ //判断是否是IOS设备 // IOS分享时的页面是首页,也就是进入页而不是当前页.所有可以采用刷新当前页,让进入页的链接改成当 ...

  10. django中初学常犯错误之梳理

    一,关于setting设置,1,两个INSRALLEN_APPS,需要将新建的app添加进去 2,需要再setting将html的路径拼接起来 二,urls.py 设置,from app名 impor ...