[THUSC2016]成绩单 [区间dp]
简单区间dp。
考虑 \(f_{i,j,mn,mx}\)表示 \(i,j\) 区间的最大值为 \(mx\),最小值为 \(mn\) 的最小花费,\(g_{i,j}\) 为删掉 \([i,j]\) 的最小花费。目标答案:\(g_{1,n}\)
我们容易发现这个状态可以由区间 \([L,R-1]\) 和 \([R,R]\) 合并起来,即加入一个 \(v_r\) ,第一个转移方程 \(f_{i,j,\min(mn,v_r),\max(mx,v_r)} = \min \{f_{i,j-1,mn,mx}\}\)
我们还可以枚举断点 \(k\) , 把区间分成 \([L,k]\) 和 \([k+1,r]\)
\(f_{i,j,mn,mx} = \min (f_{i,j,mn,mx},f_{i,k,mn,mx} + g_{k+1,r})\)
更新 \(g_{l,r}\)
枚举 \(f_{l,r,mn,mx}\) 最小值为 \(mn\),最小值为 \(mx\),模拟删去过程就好了。
\(g_{l,r} = \min(f_{l,r,mn,mx}+a+b(mx-mn)^2)\)
这题没了
// powered by c++11
// by Isaunoya
#include<bits/stdc++.h>
#define rep(i , x , y) for(register int i = (x) ; i <= (y) ; ++ i)
#define Rep(i , x , y) for(register int i = (x) ; i >= (y) ; -- i)
using namespace std ;
using db = double ;
using ll = long long ;
using uint = unsigned int ;
#define int long long
using pii = pair < int , int > ;
#define ve vector
#define Tp template
#define all(v) v.begin() , v.end()
#define sz(v) ((int)v.size())
#define pb emplace_back
#define fir first
#define sec second
// the cmin && cmax
Tp < class T > void cmax(T & x , const T & y) {
if(x < y) x = y ;
}
Tp < class T > void cmin(T & x , const T & y) {
if(x > y) x = y ;
}
// sort , unique , reverse
Tp < class T > void sort(ve < T > & v) {
sort(all(v)) ;
}
Tp < class T > void unique(ve < T > & v) {
sort(all(v)) ;
v.erase(unique(all(v)) , v.end()) ;
}
Tp < class T > void reverse(ve < T > & v) {
reverse(all(v)) ;
}
const int SZ = 0x191981 ;
struct FILEIN {
~ FILEIN () {} char qwq[SZ] , * S = qwq , * T = qwq , ch ;
char GETC() {
return (S == T) && (T = (S = qwq) + fread(qwq , 1 , SZ , stdin) , S == T) ? EOF : * S ++ ;
}
FILEIN & operator >> (char & c) {
while(isspace(c = GETC())) ;
return * this ;
}
FILEIN & operator >> (string & s) {
while(isspace(ch = GETC())) ;
s = ch ;
while(! isspace(ch = GETC())) s += ch ;
return * this ;
}
Tp < class T > void read(T & x) {
bool sign = 1 ;
while((ch = GETC()) < 0x30) if(ch == 0x2d) sign = 0 ;
x = (ch ^ 0x30) ;
while((ch = GETC()) > 0x2f) x = x * 0xa + (ch ^ 0x30) ;
x = sign ? x : -x ;
}
FILEIN & operator >> (int & x) {
return read(x) , * this ;
}
FILEIN & operator >> (signed & x) {
return read(x) , * this ;
}
FILEIN & operator >> (unsigned & x) {
return read(x) , * this ;
}
} in ;
struct FILEOUT {
const static int LIMIT = 0x114514 ;
char quq[SZ] , ST[0x114] ;
signed sz , O ;
~ FILEOUT () {
sz = O = 0 ;
}
void flush() {
fwrite(quq , 1 , O , stdout) ;
fflush(stdout) ;
O = 0 ;
}
FILEOUT & operator << (char c) {
return quq[O ++] = c , * this ;
}
FILEOUT & operator << (string str) {
if(O > LIMIT) flush() ;
for(char c : str) quq[O ++] = c ;
return * this ;
}
Tp < class T > void write(T x) {
if(O > LIMIT) flush() ;
if(x < 0) {
quq[O ++] = 0x2d ;
x = -x ;
}
do {
ST[++ sz] = x % 0xa ^ 0x30 ;
x /= 0xa ;
} while(x) ;
while(sz) quq[O ++] = ST[sz --] ;
return ;
}
FILEOUT & operator << (int x) {
return write(x) , * this ;
}
FILEOUT & operator << (signed x) {
return write(x) , * this ;
}
FILEOUT & operator << (unsigned x) {
return write(x) , * this ;
}
} out ;
int n , a , b ;
const int maxn = 52 ;
int f[maxn][maxn][maxn][maxn] ;
int g[maxn][maxn] ;
signed main() {
#ifdef _WIN64
freopen("testdata.in" , "r" , stdin) ;
#else
ios_base :: sync_with_stdio(false) ;
cin.tie(nullptr) , cout.tie(nullptr) ;
#endif
// code begin.
in >> n >> a >> b ;
vector < int > v(n) , c(n) ;
for(int i = 0 ; i < n ; i ++) {
in >> v[i] ;
c[i] = v[i] ;
}
unique(c) ; int siz = sz(c) ;
memset(f , 0x3f , sizeof(f)) ;
memset(g , 0x3f , sizeof(g)) ;
for(int i = 0 ; i < n ; i ++) {
v[i] = lower_bound(all(c) , v[i]) - c.begin() ;
f[i][i][v[i]][v[i]] = 0 ;
g[i][i] = a ;
}
for(int len = 1 ; len <= n ; len ++) {
for(int l = 0 ; l + len - 1 < n ; l ++) {
int r = l + len - 1 ;
for(int mn = 0 ; mn < siz ; mn ++)
for(int mx = mn ; mx < siz ; mx ++)
cmin(f[l][r][min(mn , v[r])][max(mx , v[r])] , f[l][r - 1][mn][mx]) ;
for(int k = l ; k < r ; k ++)
for(int mn = 0 ; mn < siz ; mn ++)
for(int mx = mn ; mx < siz ; mx ++)
cmin(f[l][r][mn][mx] , f[l][k][mn][mx] + g[k + 1][r]) ;
for(int mn = 0 ; mn < siz ; mn ++)
for(int mx = mn ; mx < siz ; mx ++)
cmin(g[l][r] , f[l][r][mn][mx] + a + b * (c[mx] - c[mn]) * (c[mx] - c[mn])) ;
}
}
out << g[0][n - 1] << '\n' ;
return out.flush() , 0 ;
// code end.
}
[THUSC2016]成绩单 [区间dp]的更多相关文章
- 【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp
题目描述 给你一个数列,每次你可以选择连续的一段,付出 $a+b\times 极差^2$ 的代价将其删去,剩余部分拼到一起成为新的数列继续进行此操作.求将原序列全部删去需要的最小总代价是多少. 输入 ...
- BZOJ.4897.[Thu Summer Camp2016]成绩单(区间DP)
BZOJ 显然是个区间DP.令\(f[l][r]\)表示全部消掉区间\([l,r]\)的最小花费. 因为是可以通过删掉若干子串来删子序列的,所以并不好直接转移.而花费只与最大最小值有关,所以再令\(g ...
- LOJ 2292 「THUSC 2016」成绩单——区间DP
题目:https://loj.ac/problem/2292 直接 DP 很难做,主要是有那种 “一个区间内部有很多个别的区间” 的情况. 自己想了一番枚举 max-min 的最大限制,然后在该基础上 ...
- BZOJ4897 THUSC2016成绩单(区间dp)
拿走一个区间的代价只与最大最小值有关,并且如果最后一次拿走包含区间右端点的子序列一定不会使答案更劣,于是设f[i][j][x][y]为使i~j区间剩余最小值为x最大值为y且若有数剩余一定包含j的最小代 ...
- 【LOJ2292】[THUSC2016]成绩单(区间DP)
题目 LOJ2292 分析 比较神奇的一个区间 DP ,我看了很多题解都没看懂,大约是我比较菜罢. 先明确一下题意:abcde 取完 c 后变成 abde ,可以取 bd 这样取 c 后新增的连续段. ...
- [BZOJ4897][THUSC2016]成绩单(DP)
4897: [Thu Summer Camp2016]成绩单 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 220 Solved: 132[Subm ...
- 【题解】【THUSC 2016】成绩单 LOJ 2292 区间dp
Prelude 快THUWC了,所以补一下以前的题. 真的是一道神题啊,网上的题解没几篇,而且还都看不懂,我做了一天才做出来. 传送到LOJ:(>人<:) Solution 直接切入正题. ...
- 区间dp提升复习
区间\(dp\)提升复习 不得不说这波题真的不简单... 技巧总结: 1.有时候转移可以利用背包累和 2.如果遇到类似区间添加限制的题可以直接把限制扔在区间上,每次只考虑\([l,r]\)被\([i, ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
随机推荐
- MySQL存储引擎——MyISAM与InnoDB区别
注:本文来自:https://blog.csdn.net/xifeijian/article/details/20316775 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型, ...
- mongoDB常用命令与安全加固
一.介绍 MongoDB 是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
- Linux 邮件服务
三个要点 1.smtp协议 2.搭建本地邮件服务器 3.使用外部邮件服务器 实现邮件功能 1.smtp协议 SMTP(Simple Mail Transfer Protocol)即 ...
- vue-cli项目传到服务器后打不开的问题
1.vue-cli项目执行dev可以打开网站,直接点击文件或发布后却打不开的问题 webpack.prod.conf.js: output: { ....... publicPath:'./' ...
- C语言switch中case后跟随break语句
1.case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即“只是开始执行处的入口标号”.因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行:而且执行完一个case ...
- linux中find文件搜索命令
find 解释 命令名称:find 命令所在路径:/bin/find 执行权限:所有用户 功能描述:文件搜索 语法 find [搜索范围] [匹配条件] 匹配条件: -name 文件名(区分大小写) ...
- 来简单说说var,let,const,function,import,class
一.var和let var已经在JavaScript中存在很长一段时间了,但是它存在了一些不足的地方,接下来我们就来看看吧 首先var存在变量提升,这是怎么一回事呢,我们看下面代码 为什么是它呢,是因 ...
- redis 5.0.7 源码阅读——压缩列表ziplist
redis中压缩列表ziplist相关的文件为:ziplist.h与ziplist.c 压缩列表是redis专门开发出来为了节约内存的内存编码数据结构.源码中关于压缩列表介绍的注释也写得比较详细. 一 ...
- 全文检索以及Lucene的应用
全文检索 一.什么是全文检索? 就是在检索数据,数据的分类: 在计算机当中,比如说存在磁盘的文本文档,HTML页面,Word文档等等...... 1.结构化数据 格式固定,长度固定,数据类型固定等等, ...
- 02-flink时间语义 与 Window 基础概念与实现原理
Flink 多种时间语义对比 Flink 在流应用程序中支持不同的 Time 概念,就比如有 Processing Time.Event Time 和 Ingestion Time.下面我们一起来看看 ...