简单区间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)\)

这题没了

  1. // powered by c++11
  2. // by Isaunoya
  3. #include<bits/stdc++.h>
  4. #define rep(i , x , y) for(register int i = (x) ; i <= (y) ; ++ i)
  5. #define Rep(i , x , y) for(register int i = (x) ; i >= (y) ; -- i)
  6. using namespace std ;
  7. using db = double ;
  8. using ll = long long ;
  9. using uint = unsigned int ;
  10. #define int long long
  11. using pii = pair < int , int > ;
  12. #define ve vector
  13. #define Tp template
  14. #define all(v) v.begin() , v.end()
  15. #define sz(v) ((int)v.size())
  16. #define pb emplace_back
  17. #define fir first
  18. #define sec second
  19. // the cmin && cmax
  20. Tp < class T > void cmax(T & x , const T & y) {
  21. if(x < y) x = y ;
  22. }
  23. Tp < class T > void cmin(T & x , const T & y) {
  24. if(x > y) x = y ;
  25. }
  26. // sort , unique , reverse
  27. Tp < class T > void sort(ve < T > & v) {
  28. sort(all(v)) ;
  29. }
  30. Tp < class T > void unique(ve < T > & v) {
  31. sort(all(v)) ;
  32. v.erase(unique(all(v)) , v.end()) ;
  33. }
  34. Tp < class T > void reverse(ve < T > & v) {
  35. reverse(all(v)) ;
  36. }
  37. const int SZ = 0x191981 ;
  38. struct FILEIN {
  39. ~ FILEIN () {} char qwq[SZ] , * S = qwq , * T = qwq , ch ;
  40. char GETC() {
  41. return (S == T) && (T = (S = qwq) + fread(qwq , 1 , SZ , stdin) , S == T) ? EOF : * S ++ ;
  42. }
  43. FILEIN & operator >> (char & c) {
  44. while(isspace(c = GETC())) ;
  45. return * this ;
  46. }
  47. FILEIN & operator >> (string & s) {
  48. while(isspace(ch = GETC())) ;
  49. s = ch ;
  50. while(! isspace(ch = GETC())) s += ch ;
  51. return * this ;
  52. }
  53. Tp < class T > void read(T & x) {
  54. bool sign = 1 ;
  55. while((ch = GETC()) < 0x30) if(ch == 0x2d) sign = 0 ;
  56. x = (ch ^ 0x30) ;
  57. while((ch = GETC()) > 0x2f) x = x * 0xa + (ch ^ 0x30) ;
  58. x = sign ? x : -x ;
  59. }
  60. FILEIN & operator >> (int & x) {
  61. return read(x) , * this ;
  62. }
  63. FILEIN & operator >> (signed & x) {
  64. return read(x) , * this ;
  65. }
  66. FILEIN & operator >> (unsigned & x) {
  67. return read(x) , * this ;
  68. }
  69. } in ;
  70. struct FILEOUT {
  71. const static int LIMIT = 0x114514 ;
  72. char quq[SZ] , ST[0x114] ;
  73. signed sz , O ;
  74. ~ FILEOUT () {
  75. sz = O = 0 ;
  76. }
  77. void flush() {
  78. fwrite(quq , 1 , O , stdout) ;
  79. fflush(stdout) ;
  80. O = 0 ;
  81. }
  82. FILEOUT & operator << (char c) {
  83. return quq[O ++] = c , * this ;
  84. }
  85. FILEOUT & operator << (string str) {
  86. if(O > LIMIT) flush() ;
  87. for(char c : str) quq[O ++] = c ;
  88. return * this ;
  89. }
  90. Tp < class T > void write(T x) {
  91. if(O > LIMIT) flush() ;
  92. if(x < 0) {
  93. quq[O ++] = 0x2d ;
  94. x = -x ;
  95. }
  96. do {
  97. ST[++ sz] = x % 0xa ^ 0x30 ;
  98. x /= 0xa ;
  99. } while(x) ;
  100. while(sz) quq[O ++] = ST[sz --] ;
  101. return ;
  102. }
  103. FILEOUT & operator << (int x) {
  104. return write(x) , * this ;
  105. }
  106. FILEOUT & operator << (signed x) {
  107. return write(x) , * this ;
  108. }
  109. FILEOUT & operator << (unsigned x) {
  110. return write(x) , * this ;
  111. }
  112. } out ;
  113. int n , a , b ;
  114. const int maxn = 52 ;
  115. int f[maxn][maxn][maxn][maxn] ;
  116. int g[maxn][maxn] ;
  117. signed main() {
  118. #ifdef _WIN64
  119. freopen("testdata.in" , "r" , stdin) ;
  120. #else
  121. ios_base :: sync_with_stdio(false) ;
  122. cin.tie(nullptr) , cout.tie(nullptr) ;
  123. #endif
  124. // code begin.
  125. in >> n >> a >> b ;
  126. vector < int > v(n) , c(n) ;
  127. for(int i = 0 ; i < n ; i ++) {
  128. in >> v[i] ;
  129. c[i] = v[i] ;
  130. }
  131. unique(c) ; int siz = sz(c) ;
  132. memset(f , 0x3f , sizeof(f)) ;
  133. memset(g , 0x3f , sizeof(g)) ;
  134. for(int i = 0 ; i < n ; i ++) {
  135. v[i] = lower_bound(all(c) , v[i]) - c.begin() ;
  136. f[i][i][v[i]][v[i]] = 0 ;
  137. g[i][i] = a ;
  138. }
  139. for(int len = 1 ; len <= n ; len ++) {
  140. for(int l = 0 ; l + len - 1 < n ; l ++) {
  141. int r = l + len - 1 ;
  142. for(int mn = 0 ; mn < siz ; mn ++)
  143. for(int mx = mn ; mx < siz ; mx ++)
  144. cmin(f[l][r][min(mn , v[r])][max(mx , v[r])] , f[l][r - 1][mn][mx]) ;
  145. for(int k = l ; k < r ; k ++)
  146. for(int mn = 0 ; mn < siz ; mn ++)
  147. for(int mx = mn ; mx < siz ; mx ++)
  148. cmin(f[l][r][mn][mx] , f[l][k][mn][mx] + g[k + 1][r]) ;
  149. for(int mn = 0 ; mn < siz ; mn ++)
  150. for(int mx = mn ; mx < siz ; mx ++)
  151. cmin(g[l][r] , f[l][r][mn][mx] + a + b * (c[mx] - c[mn]) * (c[mx] - c[mn])) ;
  152. }
  153. }
  154. out << g[0][n - 1] << '\n' ;
  155. return out.flush() , 0 ;
  156. // code end.
  157. }

[THUSC2016]成绩单 [区间dp]的更多相关文章

  1. 【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp

    题目描述 给你一个数列,每次你可以选择连续的一段,付出 $a+b\times 极差^2$ 的代价将其删去,剩余部分拼到一起成为新的数列继续进行此操作.求将原序列全部删去需要的最小总代价是多少. 输入 ...

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

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

  3. LOJ 2292 「THUSC 2016」成绩单——区间DP

    题目:https://loj.ac/problem/2292 直接 DP 很难做,主要是有那种 “一个区间内部有很多个别的区间” 的情况. 自己想了一番枚举 max-min 的最大限制,然后在该基础上 ...

  4. BZOJ4897 THUSC2016成绩单(区间dp)

    拿走一个区间的代价只与最大最小值有关,并且如果最后一次拿走包含区间右端点的子序列一定不会使答案更劣,于是设f[i][j][x][y]为使i~j区间剩余最小值为x最大值为y且若有数剩余一定包含j的最小代 ...

  5. 【LOJ2292】[THUSC2016]成绩单(区间DP)

    题目 LOJ2292 分析 比较神奇的一个区间 DP ,我看了很多题解都没看懂,大约是我比较菜罢. 先明确一下题意:abcde 取完 c 后变成 abde ,可以取 bd 这样取 c 后新增的连续段. ...

  6. [BZOJ4897][THUSC2016]成绩单(DP)

    4897: [Thu Summer Camp2016]成绩单 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 220  Solved: 132[Subm ...

  7. 【题解】【THUSC 2016】成绩单 LOJ 2292 区间dp

    Prelude 快THUWC了,所以补一下以前的题. 真的是一道神题啊,网上的题解没几篇,而且还都看不懂,我做了一天才做出来. 传送到LOJ:(>人<:) Solution 直接切入正题. ...

  8. 区间dp提升复习

    区间\(dp\)提升复习 不得不说这波题真的不简单... 技巧总结: 1.有时候转移可以利用背包累和 2.如果遇到类似区间添加限制的题可以直接把限制扔在区间上,每次只考虑\([l,r]\)被\([i, ...

  9. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

随机推荐

  1. python练习——第1题

    原GitHub地址:https://github.com/Yixiaohan/show-me-the-code 题目:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激 ...

  2. 【Bullet引擎】Bullet物理引擎简单说明

    说明 Bullet是一款开源的物理模拟计算引擎,包括刚体.柔体.弹性体等,是世界三大物理模拟引擎之一(包括Havok和PhysX),被广泛应用于游戏开发(GTA5等)和电影(2012等)制作中. Bu ...

  3. 将Spring实战第5版中Spring HATEOAS部分代码迁移到Spring HATEOAS 1.0

    最近在阅读Spring实战第五版中文版,书中第6章关于Spring HATEOAS部分代码使用的是Spring HATEOAS 0.25的版本,而最新的Spring HATEOAS 1.0对旧版的AP ...

  4. ajax面试要点

    目录 目录 ajax是什么? 优点 缺点 ajax的工作原理 如何创建一个ajax(ajax的交互模型) ajax过程中get和post的区别 同步和异步的区别 JavaScript 的同源策略 如何 ...

  5. k8s Pipline CI/CD

    一.Pipeline介绍 pipeline是一套jenkins官方提供的插件,它可以用来在jenkins中实现和集成连续交付 用户可以利用Pipeline的许多功能: 代码:pipeline在代码中实 ...

  6. [CSS]important提升直选标签优先级

    <style> #identity{ color: purple; } p { color: yellowgreen !important; } </style> <!- ...

  7. JS将扁平化的数据处理成Tree结构

    let jsonData= [ { id:1,  parentId:0, name:"一级菜单A" }, { id:2, parentId:0, name:"一级菜单B& ...

  8. 05.JS函数

    前言: 学习一门编程语言的基本步骤(01)了解背景知识(02)搭建开发环境(03)语法规范(04)常量和变量(05)数据类型(06)数据类型转换(07)运算符(08)逻辑结构(09)函数9.函数——f ...

  9. 1.4掌握日志工具的使用——Android第一行代码(第二版)笔记

    Android中的日志工具类是Log(android.util.Log),这个类中提供了如下5个方法来供我们打印日志. Log.v():用于打印那些最为琐碎的.意义最小的日志信息.对应级别verbos ...

  10. pycharm工具连接mysql数据库失败

    在使用pycharm开发工具连接mysql数据库时提示错误,信息如下: Server returns invalid timezone. Go to 'Advanced' tab and set 's ...