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时的最大贡献。
然后可以枚举端点转移。
当时口胡到这儿就不会了。
于是细节请教了DZYODZYODZYO学长。
大概就是预处理出区间[l,r][l,r][l,r]中大于等于valvalval的有几个数来优化转移。
每个fff数组中记录:
当前的最优值。
k以及其后缀的最优值的最优值。
当前区间最优值取得的端点。
以及对应的数。
代码(跟DZYODZYODZYO的差不多巨佬勿喷):
#include<bits/stdc++.h>
#define N 52
#define M 4005
#define fi first
#define se second
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef pair<int,int> pii;
pii S[M];
int n,m,cnt[N][N][M],rk[M],l[M],r[M],c[M],tot=0;
struct node{pii val;int pos,pre;}f[N][N][M];
node dfs(int l,int r,int w){
if(l>r||w>tot)return (node){make_pair(0,0),0,0};
if(~f[l][r][w].val.fi)return f[l][r][w];
f[l][r][w].val.fi=0;
node tmp=dfs(l,r,w+1);
if(l==r){
f[l][l][w].val.fi=cnt[l][l][w]*rk[w];
f[l][l][w].val.se=max(f[l][l][w].val.fi,tmp.val.se);
f[l][l][w].pre=(w!=tot&&tmp.val.se>f[l][l][w].val.fi)?tmp.pre:w;
f[l][l][w].pos=l;
return f[l][l][w];
}
int pos,mx=0;
for(int mid=l,mxtmp=0;mid<=r;++mid){
mxtmp=dfs(l,mid-1,w).val.se+rk[w]*(cnt[l][r][w]-cnt[l][mid-1][w]-cnt[mid+1][r][w])+dfs(mid+1,r,w).val.se;
if(mxtmp>=mx)mx=mxtmp,pos=mid;
}
f[l][r][w].val.fi=mx;
f[l][r][w].val.se=max(mx,tmp.val.se);
f[l][r][w].pos=pos;
f[l][r][w].pre=(w!=tot&&tmp.val.se>mx)?tmp.pre:w;
return f[l][r][w];
}
inline void print(int l,int r,int val){
int pre=f[l][f[l][r][val].pos-1][val].pre,suf=f[f[l][r][val].pos+1][r][val].pre;
if(l<f[l][r][val].pos&&pre)print(l,f[l][r][val].pos-1,pre);
printf("%d ",rk[val]);
if(r>f[l][r][val].pos&&suf)print(f[l][r][val].pos+1,r,suf);
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;++i)l[i]=read(),r[i]=read(),c[i]=read(),S[i]=make_pair(c[i],i);
sort(S+1,S+m+1);
for(int i=1;i<=m;++i){
if(i==1||(S[i].fi^S[i-1].fi))++tot;
rk[tot]=c[S[i].se],c[S[i].se]=tot;
}
for(int i=1;i<=n;++i)for(int j=i;j<=n;++j)for(int k=1;k<=tot;++k)f[i][j][k].val.fi=-1;
for(int i=1;i<=m;++i)for(int j=1;j<=l[i];++j)for(int k=r[i];k<=n;++k)++cnt[j][k][c[i]];
for(int i=1;i<=n;++i)for(int j=i;j<=n;++j)for(int k=tot;k;--k)cnt[i][j][k]+=cnt[i][j][k+1];
int Pos,mx=0;
for(int i=tot;i;--i){
node tmp=dfs(1,n,i);
if(tmp.val.fi>mx)Pos=i,mx=tmp.val.fi;
}
printf("%d\n",mx);
print(1,n,Pos);
return 0;
}
2018.10.22 bzoj4380: [POI2015]Myjnie(区间dp)的更多相关文章
- 【BZOJ4380】[POI2015]Myjnie 区间DP
[BZOJ4380][POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[ ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 2018.10.23 hdu2476String painter(区间dp)
传送门 一道挺妙的区间dp. 我们先用区间dp求出第一个串为空串时的最小代价. 然后再加入原本的字符更新答案就行了. 代码: #include<bits/stdc++.h> using n ...
- 2018.10.23 hdu4745Two Rabbits(区间dp)
传送门 区间dp经典题目. 首先断环为链. 然后题目相当于就是在找最大的回文子序列. 注意两个位置重合的时候相当于范围是n,不重合时范围是n-1. 代码: #include<bits/stdc+ ...
- 2018.10.22 bzoj1742: Grazing on the Run 边跑边吃草(区间dp)
传送门 区间dp入门题. 可以想到当前吃掉的草一定是一个区间(因为经过的草一定会吃掉). 然后最后一定会停在左端点或者右端点. f[i][j][0/1]f[i][j][0/1]f[i][j][0/1] ...
- 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: ...
- 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)
传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...
- NOIP模拟赛-2018.10.22
模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...
随机推荐
- php缓存类
<?php /* * 缓存类 cache * 实 例: include( "cache.php" ); $cache = new cache(30); $cache-> ...
- 13 python logging模块
原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日 ...
- Flex 布局教程:实例
分类: 开发者手册 Flex 布局教程:实例篇 作者: 阮一峰 日期: 2015年7月14日 上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到,不管是什么布局,Fle ...
- FileOperator 文件(夹)操作类
public class FileOperator { /** * 复制文件目录 * @param srcDir 要复制的源目录 eg:/mnt/sdcard/DB * @param destDir ...
- C++ 0x 使用可变参数模板类 实现 C# 的委托机制
#ifndef _ZTC_DELEGATE_H_ #define _ZTC_DELEGATE_H_ #include <vector> #include <functional> ...
- 常用类一一时间处理相关类一一java.util.Tomezone(java.util.Calendar , java.util.Date , java.text.DateFormat)
时间处理相关类 时间是一个一维的东东.所以,我们需要一把刻度尺来区表达和度量时间.在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一). ...
- jenkins 自动构建gitlab项目
安装的plugin: - kubernetes:1.7.1 - workflow-aggregator:2.5 - workflow-job:2.21 - credentials-b ...
- mysql mapper中增删查改
//1.增 public int insert(Port port) ; //2.删 public int deleteM(String id);//3.改 public int update(Por ...
- Zabbix 监控端口状态并邮件报警
Zabbix监控端口 前提 zabbix安装 zabbix邮件报警 添加监控项 添加触发器 添加动作 设置完成后,在配置过报警媒介后也就是 邮件报警 后就完成了.
- JPA报错, PersistenceException_Unable to build Hibernate SessionFactory
javax.persistence.PersistenceException: [PersistenceUnit: TestJPA] Unable to build Hibernate Session ...