【BZOJ-4380】Myjnie 区间DP

时间:2023-01-01 10:38:07

4380: [POI2015]Myjnie

Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 162  Solved: 82
[Submit][Status][Discuss]

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],c[i](1<=a[i]<=b[i]<=n,1<=c[i]<=500000)

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

HINT

Source

鸣谢Claris

Solution

这个区间dp好厉害啊,自己的转移并没有想到,最后是看着Claris的课件做的。

现将$c_{i}$离散化,然后区间dp

$dp[l][r][p]$表示区间$[l,r]$,最小价值为$p$的最大总和,$cnt[k][c]$表示经过$k$位置的费用$\geqslant c$的数量

转移时通过枚举最小值所在的位置$k$,来进行转移$dp[l][r][p]<--dp[l][k-1][p]+dp[k+1][r][p]+cost(k)$

还要记录方案,最后用dfs输出。

总的时间复杂度$O(N^{3}M)$

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int N,M,a[],b[],c[],C[],price[],ls[],tp,top;
int from[][][],last[][][],cnt[][],dp[][][];
inline void Get(int l,int r,int p)
{
if (l>r) return;
int fr=from[l][r][p],la=last[l][r][p];
// printf("%d %d %d %d\n",l,r,p,fr);
price[fr]=C[la];
Get(l,fr-,la); Get(fr+,r,la);
}
int main()
{
N=read(),M=read();
for (int i=; i<=M; i++) a[i]=read(),b[i]=read(),C[i]=c[i]=read(),ls[++tp]=c[i];
sort(ls+,ls+tp+);
for (int i=; i<=tp; i++) if (ls[top]!=ls[i]) ls[++top]=ls[i];
for (int i=,x; i<=M; i++) x=lower_bound(ls+,ls+top+,c[i])-ls,C[x]=c[i],c[i]=x;
// for (int i=1; i<=M; i++) printf("%d ",C[i]); puts("");
for (int l=; l<=N; l++)
for (int r=l; r<=N; r++)
for (int p=; p<=M; p++)
dp[l][r][p]=-0x3fffffff;
for (int len=; len<=N; len++)
for (int l=,r=l+len-; r<=N; l++,r++)
{
for (int k=l; k<=r; k++)
for (int i=; i<=M; i++)
cnt[k][i]=;
for (int i=; i<=M; i++)
if (a[i]>=l && b[i]<=r)
for (int k=a[i]; k<=b[i]; k++)
cnt[k][c[i]]++;
for (int k=l; k<=r; k++)
for (int i=M-; i; i--)
cnt[k][i]+=cnt[k][i+];
for (int k=l; k<=r; k++)
for (int i=; i<=M; i++)
if (dp[l][k-][i]+dp[k+][r][i]+C[i]*cnt[k][i]>dp[l][r][i])
dp[l][r][i]=dp[l][k-][i]+dp[k+][r][i]+C[i]*cnt[k][i],
from[l][r][i]=k,last[l][r][i]=i;// from[l][r][i]=i;
for (int i=M-; i; i--)
if (dp[l][r][i]<dp[l][r][i+])
dp[l][r][i]=dp[l][r][i+],
from[l][r][i]=from[l][r][i+],last[l][r][i]=last[l][r][i+];
// printf("<%d , %d> == %d\n",l,r,dp[l][r][1]);
}
printf("%d\n",dp[][N][]);
Get(,N,);
for (int i=; i<=N; i++) printf("%d ",price[i]);
return ;
}

【BZOJ-4380】Myjnie 区间DP的更多相关文章

  1. BZOJ 4380 Myjnie 区间DP

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

  2. 【BZOJ4380】&lbrack;POI2015&rsqb;Myjnie 区间DP

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

  3. &lbrack;bzoj&rsqb; 1068 压缩 &vert;&vert; 区间dp

    原题 f[i][j][0/1]表示i-1处有一个M,i到j压缩后的长度,0/1表示i到j中有没有m. 初始为j-i+1 f[i][j][0]=min(f[i][j][0],f[i][k][0]+j-k ...

  4. 【BZOJ 4380】4380&colon; &lbrack;POI2015&rsqb;Myjnie (区间DP)

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

  5. BZOJ 4380 &lbrack;POI2015&rsqb;Myjnie &vert; DP

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

  6. BZOJ&period;4897&period;&lbrack;Thu Summer Camp2016&rsqb;成绩单&lpar;区间DP&rpar;

    BZOJ 显然是个区间DP.令\(f[l][r]\)表示全部消掉区间\([l,r]\)的最小花费. 因为是可以通过删掉若干子串来删子序列的,所以并不好直接转移.而花费只与最大最小值有关,所以再令\(g ...

  7. &lbrack;BZOJ 1652&rsqb;&lbrack;USACO 06FEB&rsqb;Treats for the Cows 题解(区间DP)

    [BZOJ 1652][USACO 06FEB]Treats for the Cows Description FJ has purchased N (1 <= N <= 2000) yu ...

  8. &lbrack;BZOJ 1260&rsqb;&lbrack;CQOI2007&rsqb;涂色paint 题解(区间DP)

    [BZOJ 1260][CQOI2007]涂色paint Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为 ...

  9. &lbrack;BZOJ 1032&rsqb;&lbrack;JSOI 2007&rsqb;祖玛 题解(区间DP)

    [BZOJ 1032][JSOI 2007]祖玛 Description https://www.lydsy.com/JudgeOnline/problem.php?id=1032 Solution ...

随机推荐

  1. java&period;io包中的字节流—— FilterInputStream和FilterOutputStream

    接着上篇文章,本篇继续说java.io包中的字节流.按照前篇文章所说,java.io包中的字节流中的类关系有用到GoF<设计模式>中的装饰者模式,而这正体现在FilterInputStre ...

  2. php header函数详解

    客户机的请求方式格式:是统一资源标识符.协议版本号,后边是MIME信息包括请求修饰符.客户机信息和可能的内容!服务器响应格式:一个状态行包括信息的协议版本号.一个成功或错误的代码,后边是MIME信息包 ...

  3. Parallel并行运算实例

    并行运算Parallel,是.net 4.0版本里添加的新处理方式,主要充分利用CPU.任务并发的模式来达到提高运算能力.简单理解为每个CPU都在处理任务,而不会让它们空闲下来. 直接看实例: nam ...

  4. 暑假集训&lpar;2&rpar;第五弹 ----- Who&&num;39&semi;s in the Middle(poj2388&rpar;

    G - Who's in the Middle Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32 ...

  5. php导出excel不断刷新缓冲区的思路&lpar;转&rpar;

    require('./db.class.php');$DB = new db();$DB->connect();//数据库链接 header("Content-Type: text/c ...

  6. 【百度之星2014~初赛(第二轮)解题报告】JZP Set

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  7. CentOS安装node&period;js-8&period;11&period;1&plus;替换淘宝NPM镜像

    注:以下所有操作均在CentOS 6.8 x86_64位系统下完成. #准备工作# 由于node.js-8.11.1在源码编译安装的时候需要gcc 4.9.4或clang++ 3.4.2以上版本的支持 ...

  8. Django(九)下:Ajax操作、图片验证码、KindEditor使用

    三.Ajax操作 ajax操作基于浏览器的xmlHttpRequest对象,IE低版本是另外一个对象,jQuery 1 版本对那两个对象做了封装,兼容性最好,2 .3版本不再支持IE低版本了. Aja ...

  9. &lbrack;LeetCode&rsqb; 10&period; 正则表达式匹配

    题目链接:https://leetcode-cn.com/problems/regular-expression-matching/ 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支 ...

  10. 微信小程序 数据库指引 前端操纵数据库失败

    把注释解开后,点击添加显示失败了 看了下注解,发现是数据库权限问题, 修改一下成第一个,然后点击又失败了,多点击几下,就会成功! 哦 别忘了时刻 ctrl +s 保存,如果你习惯了idea 自动保存的 ...