Description

有$n$家洗车店从左往右排成一排,每家店都有一个正整数价格$p[i]$。

有$m$个人要来消费,第$i$个人会驶过第$a[i]$个开始一直到第$b[i]$个洗车店,且会选择这些店中最便宜的一个进行一次消费。但是如果这个最便宜的价格大于$c[i]$,那么这个人就不洗车了。

请给每家店指定一个价格,使得所有人花的钱的总和最大。

Solution

神仙$DP$ QAQ

每个店的价格肯定是$c_i$中的某一个值, 所以可以离散化

定义状态 $dp[L][R][k]$ 表示 在区间$[i,j]$ 最小值为$k$ 时所能收益的最大值

转移 : $dp[L][R][k] = \max{(dp[L][i - 1][k] + dp[i + 1][R][k] + cnt[i][k])}$

但是发现这样无法快速求出答案, 所以把$dp[L][R][k]$定义为 最小值 $>=k$时所能收益的最大值。

则多了一个转移: $dp[L][R][k] = \max{(dp[L][R][k], dp[L][R][k + 1])}$。

题目要求 求出方案, 则定义$val[L][R][k]$ 为真正的$k$值, $P[L][R][k]$ 为哪个位置取 $k$

最后递归求方案

空间复杂度$O(N^2M)$, 时间复杂度$O(N^3M)$

Code

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define N 55
#define M 4005
#define rd read()
using namespace std; int n, m;
int dp[N][N][M], cnt[N][M], val[N][N][M], P[N][N][M];
int ls[M], tot, ans[N]; struct node {
int l, r, val;
}a[M]; inline int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} int fd(int x) {
return lower_bound(ls + , ls + + tot, x) - ls;
} void cmax(int &A, int B) {
if (A < B)
A = B;
} void DP(int L, int R) {
memset(cnt, , sizeof(cnt));
for (int i = ; i <= m; ++i) {
if (a[i].l < L || a[i].r > R)
continue;
for (int j = a[i].l; j <= a[i].r; ++j)
cnt[j][a[i].val]++;
}
for (int i = L; i <= R; ++i)
for (int j = tot - ; j; --j)
cnt[i][j] += cnt[i][j + ];
for (int i = tot; i; --i) {
int maxn = -, pos = ;
for (int j = L; j <= R; ++j) {
int res = dp[L][j - ][i] + dp[j + ][R][i] + cnt[j][i] * ls[i];
if (res > maxn)
maxn = res, pos = j;
cmax(dp[L][R][i], res);
}
val[L][R][i] = i;
P[L][R][i] = pos;
if(i < m && dp[L][R][i] < dp[L][R][i + ])
val[L][R][i] = val[L][R][i + ],
dp[L][R][i] = dp[L][R][i + ],
P[L][R][i] = P[L][R][i + ];
}
} void findans(int L, int R, int lim) {
if (L > R) return;
int fin = val[L][R][lim], pos = P[L][R][lim];
ans[pos] = fin;
findans(L, pos - , fin);
findans(pos + , R, fin);
} int main()
{
n = rd; m = rd;
for (int i = ; i <= m; ++i) {
a[i].l = rd; a[i].r = rd; a[i].val = rd;
ls[++tot] = a[i].val;
}
sort(ls + , ls + + tot);
tot = unique(ls + , ls + + tot) - ls - ;
for (int i = ; i <= m; ++i)
a[i].val = fd(a[i].val);
for (int i = n; i; --i)
for (int j = i; j <= n; ++j)
DP(i, j);
printf("%d\n", dp[][n][]);
findans(, n, );
for (int i = ; i <= n; ++i)
printf("%d ", ls[ans[i]]);
puts("");
}

BZOJ4380 Myjnie / Luogu3592 [POI2015]MYJ-区间DP的更多相关文章

  1. 2018.10.22 bzoj4380: [POI2015]Myjnie(区间dp)

    传送门 区间dp好题. f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]最小值为kkk时的最大贡献. 然后可以枚举端点转移. 当时口胡到这儿就不会了. ...

  2. 【BZOJ-4380】Myjnie 区间DP

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

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

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

  4. BZOJ 4380 Myjnie 区间DP

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

  5. P3592 [POI2015]MYJ

    P3592 [POI2015]MYJ 一道比较烦的区间dp.. 昨天上课讲到了这题,然后就在lg翻到了 然后调了很久很久..... 设\(f[l][r][k]\)为区间\([l,r]\)中,最小值\( ...

  6. luogu P3592 [POI2015]MYJ

    题目链接 luogu P3592 [POI2015]MYJ 题解 区间dp 设f[l][r][k]表示区间l到r内最小值>=k的最大收益 枚举为k的位置p,那么包含p的区间答案全部是k 设h[i ...

  7. 区间dp提升复习

    区间\(dp\)提升复习 不得不说这波题真的不简单... 技巧总结: 1.有时候转移可以利用背包累和 2.如果遇到类似区间添加限制的题可以直接把限制扔在区间上,每次只考虑\([l,r]\)被\([i, ...

  8. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  9. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

随机推荐

  1. SpringBoot Web开发(5) 开发页面国际化+登录拦截

    SpringBoot Web开发(5) 开发页面国际化+登录拦截 一.页面国际化 页面国际化目的:根据浏览器语言设置的信息对页面信息进行切换,或者用户点击链接自行对页面语言信息进行切换. **效果演示 ...

  2. ubuntu crontab python 定时任务备记

    crontab -e 写入: # at a.m every week with: # * * tar -zcf /var/backups/home.tgz /home/ # # For more in ...

  3. VRay材质练习(一):水、玻璃、牛奶

    软件环境 a) 3ds max 2014b) V-Ray 3.60.03 渲染效果图集 玻璃杯 玻璃杯+水 玻璃杯+牛奶 材质详细参数 一.玻璃材质 Diffuse (0,0,0), Roughnes ...

  4. KPPW2.5 漏洞利用--CSRF

    kppw2.5 CSRF漏洞复现 漏洞说明 http://192.168.50.157/kppw25/index.php?do=user&view=message&op=send 收件 ...

  5. 6.HTML+CSS制作一双眼睛

    效果地址:https://codepen.io/flyingliao/pen/oOLodJ?editors=1100 其它动画效果地址:1.https://scrimba.com/c/cJ8NPpU2 ...

  6. spring boot 错误处理总结

    在boot 中, 对404  和 异常 有了额外的处理. 当然,我们可以定制, 如何做呢? 1 写一个继承 ErrorController 的Controller 注意, 这里一定要继承 ErrorC ...

  7. Tesseract-OCR的简单使用与训练

    Tesseract,一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Docu ...

  8. myeclipse和jdk的安装和配置

    一.安装JDK 1.下载得到jdk-8u11-windows-i586.1406279697.exe,直接双击运行安装,一直next就可以,默认是安装到系统盘下面Program Files,我这里装在 ...

  9. Python代码教你批量将PDF转为Word

    很多时候在学习时发现许多文档都是PDF格式,PDF格式却不利于学习使用,因此需要将PDF转换为Word文件,但或许你从网上下载了很多软件,但只能转换前五页(如WPS等),要不就是需要收费,那有没有免费 ...

  10. Aplication的意义和生命周期,与Context的关系,以及关于Aplication和Context相关问题的记录和解决办法

    Context详解地址链接: http://blog.csdn.net/qinjuning/article/details/7310620 Application是一个应用中有且仅有一个的全局共享变量 ...