【BZOJ4380】[POI2015]Myjnie 区间DP
【BZOJ4380】[POI2015]Myjnie
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
1 4 7
3 7 13
5 6 20
6 7 1
1 2 5
Sample Output
5 5 13 13 20 20 13
题解:先离散化,然后DP:令f[i][j][k]表示在[i,j]中最小值为k的最大收益。然后转移时枚举[i,j]中的最小值l,然后用(f[i][l-1][k..m]+f[l+1][j][k..m]+所有经过l的顾客贡献)更新f[i][j][k]。那么如何计算所有经过l的顾客的贡献呢?我们在枚举到i和j时,先预处理出g[i][k]表示在当前区间中,经过i且限制条件>=k的顾客的数量。就容易转移了。
输出方案时对于DP的每个地方都维护个pre指针即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,M;
int f[55][55][4010],ref[4010],s[55][55][4010],g[55][4010],gp[55][55][4010],sp[55][55][4010],v[55];
struct node
{
int a,b,c;
}p[4010];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmp(const node &a,const node &b) {return a.c<b.c;}
void print(int l,int r,int x)
{
if(l>r) return ;
x=sp[l][r][x];
int mid=gp[l][r][x];
v[mid]=ref[x];
print(l,mid-1,x),print(mid+1,r,x);
}
int main()
{
n=rd(),m=rd();
int i,j,k,l;
for(i=1;i<=m;i++) p[i].a=rd(),p[i].b=rd(),p[i].c=rd();
sort(p+1,p+m+1,cmp);
for(i=1;i<=m;i++)
{
if(p[i].c>ref[M]) ref[++M]=p[i].c;
p[i].c=M;
}
//memset(f,-1,sizeof(f));
for(j=0;j<n;j++)
{
for(i=1;i+j<=n;i++)
{
memset(g,0,sizeof(g));
for(k=1;k<=m;k++) if(p[k].a>=i&&p[k].b<=i+j)
for(l=p[k].a;l<=p[k].b;l++) g[l][p[k].c]++;
for(l=i;l<=i+j;l++) for(k=M;k>=1;k--) g[l][k]+=g[l][k+1];
for(k=M;k>=1;k--)
{
for(l=i;l<=i+j;l++)
{
if(f[i][i+j][k]<=s[i][l-1][k]+s[l+1][i+j][k]+g[l][k]*ref[k])
{
f[i][i+j][k]=s[i][l-1][k]+s[l+1][i+j][k]+g[l][k]*ref[k];
gp[i][i+j][k]=l;
}
}
if(f[i][i+j][k]>=s[i][i+j][k+1])
s[i][i+j][k]=f[i][i+j][k],sp[i][i+j][k]=k;
else
s[i][i+j][k]=s[i][i+j][k+1],sp[i][i+j][k]=sp[i][i+j][k+1];
}
}
}
printf("%d\n",s[1][n][1]);
print(1,n,1);
for(i=1;i<=n;i++) printf("%d%c",v[i],i==n?'\n':' ');
return 0;
}
【BZOJ4380】[POI2015]Myjnie 区间DP的更多相关文章
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 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时的最大贡献. 然后可以枚举端点转移. 当时口胡到这儿就不会了. ...
- bzoj4380[POI2015]Myjnie dp
[POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 368 Solved: 185[S ...
- BZOJ 4380 Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 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区 ...
- 【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)
4380: [POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗 ...
- BZOJ 4380 [POI2015]Myjnie | DP
链接 BZOJ 4380 题面 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]. 有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个 ...
- [POI2015]Myjnie
[POI2015]Myjnie 题目大意: 有\(n(n\le50)\)家洗车店从左往右排成一排,每家店都有一个正整数价格\(d_i\). 有\(m(m\le4000)\)个人要来消费,第\(i\)个 ...
- bzoj [POI2015]Myjnie
[POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special Judge Description 有n家洗车店从左往右排成一排, ...
随机推荐
- 在windows 2008 R2上安装sharepoint 2013时遇到提示必须安装 .netframeword4.5的处理办法
近日,有个客户需要个测试环境,需要搭建一个sps2013的测试服务器 但基于服务器软件授权的考虑,让使用windows2008 作为系统服务器 但一安装就碰到个提示,要求先安装framework4.5 ...
- 360极速浏览器无法正确getHours
开发了一个显示时间的功能. 功能是这样的,首先从数据库中读取时间,然后显示到前端页面上. 数据库中:2017-08-10 14:25:35.867 前端显示:2017-08-10T14:25:35.8 ...
- Mongodb更新数组$pull修饰符
http://blog.csdn.net/yaomingyang/article/details/78701643 一.$pull修饰符会删除掉数组中符合条件的元素,使用的格式是: { $pull: ...
- Windows+Nginx+IIS做图片分布式存储详细步骤
最近几天,一直在学习nginx在windows平台下的使用,为了寻找几种大量图片分布式存储而且有相对简单的存储方案 nginx是一种,还找到一种MongoDB GridFS 这两种方案我还是比较中意的 ...
- Swift新手教程12-可选链
可选链 原创Blog,转载请注明出处 我的博客地址 http://blog.csdn.net/hello_hwc 可选链提供一个一种可选的方式訪问对象的属性.方法.下标脚本,可选链的返回值一定是可选类 ...
- 使用jquery dialog
网页开发中,弹窗还是很有必要的.本人比较喜欢jquery ui的dialog. 但是jquery dialog中也有一些略显不方便的,如:没有z-index的参数设置,脚部的按钮样式没办法自定义…… ...
- Oracle之比较NVARCHAR2字符串
一.引言 昨天遇到一个问题,一直想不通是为什么,我在pl/sql里面执行sql语句,选出字段值等于某个值的的行: '; 用select * from test;是可以查到该值的,但是用这条语句却没有结 ...
- SQLi-Labs学习笔记
结构化查询语言,也叫做SQL,从根本上说是一种处理数据库的编程语言.对于初学者,数据库仅仅是在客户端和服务端进行数据存储.SQL通过结构化查询,关系,面向对象编程等等来管理数据库.编程极客们总是搞出许 ...
- java集成开发环境常用操作集
1.简单搭建maven集成开发环境 一. Jetty安装 下载地址(包涵windows和Linux各版本,Jetty9需要JDK7):http://download.eclipse.org/j ...
- 解决Linux环境下Tomcat启动卡住问题
最近发现在服务器上启动tomcat,会存在卡住的情况,这种情况是每次必现,通过搜索发现是随机数生成问题.解决方案如下 将$JAVA_HOME/jre/lib/security/Java.securit ...