【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)
4380: [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
7 5
1 4 7
3 7 13
5 6 20
6 7 1
1 2 5Sample Output
43
5 5 13 13 20 20 13HINT
Source
【分析】
不会做这题,感觉我不会区间DP orz。。
orz Claris大神
额。。代码跟他写的好像不是很一样。
g是最大收益,f是取到最大收益的时候的 选k的那个位置
还有一个p[i][j][k]表示[i][j][k...m]的[i][j][p[i][j][k]]时的收益最大
嗯。。g的继承和求p部分主要是加速的,重点是方程
g[i][j][k]=max(g[i][l-1][k]+g[l+1][j][k]+c[k]*h[x][k])
后面两个小区间的g已经是继承过的,所以真正表示的是区间[i][l-1]然后最小值>=k的最大收益
对这种DP不熟啊!!
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define Maxn 60
- #define Maxm 4010
- int mymax(int x,int y) {return x>y?x:y;}
- int mymin(int x,int y) {return x<y?x:y;}
- int f[Maxn][Maxn][Maxm],g[Maxn][Maxn][Maxm],p[Maxn][Maxn][Maxm];
- int h[Maxn][Maxm];
- int a[Maxm],b[Maxm],c[Maxm],id[Maxm];
- struct node {int x,y;}t[Maxm];
- bool cmp(node x,node y) {return x.x<y.x;}
- int op[Maxn];
- void output(int l,int r,int k)
- {
- if(l>r) return;
- k=p[l][r][k];
- int x=f[l][r][k];
- op[x]=t[k].x;
- output(l,x-,k);output(x+,r,k);
- }
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- for(int i=;i<=m;i++)
- {
- scanf("%d%d%d",&a[i],&b[i],&c[i]);
- t[i].x=c[i];t[i].y=i;
- }
- sort(t+,t++m,cmp);
- for(int i=;i<=m;i++) id[t[i].y]=i;
- memset(g,,sizeof(g));
- for(int i=n;i>=;i--)
- for(int j=i;j<=n;j++)
- {
- for(int k=i;k<=j;k++) for(int l=;l<=m;l++) h[k][l]=;
- for(int k=;k<=m;k++) if(i<=a[k]&&b[k]<=j) for(int l=a[k];l<=b[k];l++) h[l][id[k]]++;
- for(int k=i;k<=j;k++) for(int l=m-;l>=;l--) h[k][l]+=h[k][l+];
- for(int k=m;k>=;k--)
- {
- int mx=;
- for(int l=i;l<=j;l++)
- {
- int nw;
- nw=g[i][l-][k]+g[l+][j][k]+h[l][k]*t[k].x;
- if(nw>=mx) mx=nw,f[i][j][k]=l;
- }
- if(mx>=g[i][j][k+]) g[i][j][k]=mx,p[i][j][k]=k;
- else g[i][j][k]=g[i][j][k+],p[i][j][k]=p[i][j][k+];
- }
- }
- printf("%d\n",g[][n][]);
- output(,n,);
- for(int i=;i<=n;i++) printf("%d ",op[i]);
- printf("\n");
- return ;
- }
2017-03-22 18:29:41
【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)的更多相关文章
- 【BZOJ4380】[POI2015]Myjnie 区间DP
[BZOJ4380][POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[ ...
- Bzoj 1055: [HAOI2008]玩具取名 (区间DP)
Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...
- BZOJ 4380 Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- BZOJ.1032.[JSOI2007]祖码(区间DP)
题目链接 BZOJ 洛谷 AC代码: 区间DP,f[i][j]表示消掉i~j需要的最少珠子数. 先把相邻的相同颜色的珠子合并起来. 枚举方法一样,处理一下端点可以碰撞消除的情况就行. 当然合并会出现问 ...
- Bzoj 1055 玩具取名(区间DP)
题面 题解 字符很麻烦,不妨用数字代替(比如1代表'W') const char c[5] = {0, 'W', 'I', 'N', 'G'}; 接着,像这种两个子串可以合并成另一个子串的题可以考虑区 ...
- bzoj 1068: [SCOI2007]压缩【区间dp】
神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][ ...
- BZOJ 1090: [SCOI2003]字符串折叠 区间DP
1090: [SCOI2003]字符串折叠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 4380 [POI2015]Myjnie | DP
链接 BZOJ 4380 题面 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]. 有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个 ...
随机推荐
- 强大的jQuery网格插件 ParamQuery
ParamQuery是一种轻量级的jQuery网格插件,基于用于用户界面控制.具有一致API的优秀设计模式jQueryUI Widget factory创建,能够在网页上展示各种类似于Excel和Go ...
- 【CodeForces】704 C. Black Widow 动态规划+模拟
[题目]C. Black Widow [题意]给定一个表达式,形式为(...)^(...)^......^(...)=1(n个括号),括号中为1~2个值取或.有m个变量,给出表达式的值为xi或 !xi ...
- NYOJ 814 又见拦截导弹 (模拟)
题目链接 描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以 ...
- linux学习记录.2.hello world.c
安装vim,指令: sudo apt-get install vim 建立一个子目录WorkSpace,指令 mkdir WorkSpace 转到该目录下,指令 cd WorkSpace 新建c文件, ...
- Sqlmap注入技巧收集整理
TIP1 当我们注射的时候,判断注入 http://site/script?id=10http://site/script?id=11-1 # 相当于 id=10http://site/script? ...
- php文件上传——php经典实例
php文件上传——php经典实例 表单页 <html> <head> <title>文件上传</title> <meta charset='ut ...
- python第三方库之numpy基础
前言 numpy是python的科学计算模块,底层实现用c代码,运算效率很高.numpy的核心是矩阵narray运算. narray介绍 矩阵拥有的属性 ndim属性:维度个数 shape属性:维度大 ...
- 继电器是如何成为CPU的(1)【转】
转自:http://www.cnblogs.com/bitzhuwei/p/from_relay_to_tiny_CPU.html 阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与 ...
- opencv配置过程 (cmake,vs2013,qt 5.4)
平台及软件: Windows 7 X86 Visual Studio 2013 OpenCV3.0.0 Cmake3.3 1.下载Windows下的安装文件OpenCV-3.0.0.exe,解压,选择 ...
- Python模块之pxssh
pxssh模块用于在python中ssh远程连接,执行命令,返回结果,但注意不支持Windows系统 #!/usr/bin/env python #-*- coding:utf-8 -*- from ...