【BZOJ-4380】Myjnie 区间DP
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
1 4 7
3 7 13
5 6 20
6 7 1
1 2 5
Sample Output
5 5 13 13 20 20 13
HINT
Source
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的更多相关文章
- BZOJ 4380 Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【BZOJ4380】[POI2015]Myjnie 区间DP
[BZOJ4380][POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[ ...
- [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 ...
- 【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]个洗车店,且会选择这些店中最便宜的一个 ...
- BZOJ.4897.[Thu Summer Camp2016]成绩单(区间DP)
BZOJ 显然是个区间DP.令\(f[l][r]\)表示全部消掉区间\([l,r]\)的最小花费. 因为是可以通过删掉若干子串来删子序列的,所以并不好直接转移.而花费只与最大最小值有关,所以再令\(g ...
- [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 ...
- [BZOJ 1260][CQOI2007]涂色paint 题解(区间DP)
[BZOJ 1260][CQOI2007]涂色paint Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为 ...
- [BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)
[BZOJ 1032][JSOI 2007]祖玛 Description https://www.lydsy.com/JudgeOnline/problem.php?id=1032 Solution ...
随机推荐
- 在centos 服务器上安装phalcon框架 undefined symbol: php_pdo_get_dbh_ce
去git 下载对应版本的框架 命令行: sudo yum install php-devel pcre-devel gcc make 然后使用GIT clone到服务器上,然后 git clone g ...
- 利用CSS背景颜色属性使父级div背景透明同时避免子级标签透明。
实现背景色透明效果的代码 实现各个浏览器中具备良好的透明特性的效果,IE中使用私有滤镜filter,高端浏览器使用CSS3中的rgba属性. 输入十六进制的颜色值以及透明度,自动在IE的过渡滤镜以及C ...
- pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页
java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...
- 用css隐藏元素的5种方法
.green { width: 100px; height: 100px; background-color: #a0ee00; text-align: center; float: left; ma ...
- 如何在SharePoint 当中使用纯JSOM上传任意二进制文件(小于2MB)
在微软的官方网站上有关于如何在SharePoint当中使用JS创建一个简单的文本文件的例子,经过我的思考我觉得结合Html5特性的浏览器,是完全可以通过JS来读取到文件的内容的(这一部分的内容请大家自 ...
- Javascript前端和JAVA后端对加密库的处理实例
前端加密 Javascript的加解密有开源的库,http://www.oschina.net/p/crypto-js/ 如下是具体的使用例子 <!DOCTYPE html> <ht ...
- iOS编码规范
The official raywenderlich.com Objective-C style guide. This style guide outlines the coding con ...
- RunLoop 总结:RunLoop的应用场景(二)
上一篇讲了使用RunLoop保证子线程的长时间存活,而不是执行完任务后就立刻销毁的应用场景.这一篇就讲述一下RunLoop如何保证NSTimer在视图滑动时,依然能正常运转. 参考资料 好的书籍都是值 ...
- luke使用
Luke介绍 Luke是一个方便的索引查看和诊断工具,可以访问Lucene构建的索引文件,显示和修改某些索引内容.能提供: 通过document编号或term浏览索引 查看document内容,可复制 ...
- 【推荐】CentOS安装PHP-5.6.4+扩展安装+安全配置+性能配置
注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 前段时间PHP官方发布了一个重要的安全升级公告,修复了两个unserialize函数的严重漏洞,目前受影响的版本有: ...