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】[POI2015]Myjnie 区间DP

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

  3. [bzoj] 1068 压缩 || 区间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: [POI2015]Myjnie (区间DP)

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

  5. BZOJ 4380 [POI2015]Myjnie | DP

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

  6. BZOJ.4897.[Thu Summer Camp2016]成绩单(区间DP)

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

  7. [BZOJ 1652][USACO 06FEB]Treats for the Cows 题解(区间DP)

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

  8. [BZOJ 1260][CQOI2007]涂色paint 题解(区间DP)

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

  9. [BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)

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

随机推荐

  1. spring和struts2的整合的xml代码

    导入spring的pring-framework-4.0.4.RELEASE的所有包,导入struts2下(对于初学的推荐)bin下所有的包,虽然有些包可以能现在你用不到,但可以保证你基本上不会出现缺 ...

  2. CartO

    Carto documentation The following is a list of properties provided in CartoCSS that you can apply to ...

  3. 了解JavaScript 面向对象基础 & 原型与对象

    面向对象语言中的对象 老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来 ...

  4. 海康威视,大华,宇视 的视频监控iOS Demo

    原谅我只提供一个链接,我在这里写了两遍,最后加个链接页面卡死了,下面的demo,最好真机调试.(写博客还是在别的地方写复制到这里比较好!) 一个画面可以做,4个,9个,16个画面原理是一样的,集合到自 ...

  5. Kali v2.1.2 for Raspberry Pi 3B

    最新的下载地址是: https://www.offensive-security.com/kali-linux-arm-images/ 按照官网的说法是找不到树莓派版本的SHA1SUM和SHA1SUM ...

  6. "Becoming Functional" 阅读笔记+思维导图

    <Becoming Functional>是O'Reilly公司今年(2014)7月发布的一本薄薄的小册子,151页,介绍了函数式编程的基本概念.全书使用代码范例都是基于JVM的编程语言, ...

  7. although 和 although 的区别

    作为连词的时候,although 和 though 是可以互换的.Although 一般被认为更加正式一些.比如,以下的这些句子: Growth in Europe is maintaining mo ...

  8. SQL Server 2012 新特性:新增和修改函数

    转换函数      1.PARSE      Parse是把字符串类型转化为想要的类型,看看和convert和cast的区别         SELECT PARSE ('2.111111' AS f ...

  9. 利用DetachedCriteria构建HQL参数动态匹配

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 1. DetachedCriteria构建类:CriteriaBuilder.java package com.ims.pe ...

  10. java.io.NotSerializableException: test.io.file.Student

    java.io.NotSerializableException: test.io.file.Student    at java.io.ObjectOutputStream.writeObject0 ...