loj

看着就很区间dp,所以考虑求\(f_{i,j}\)表示区间\([i,j]\)的答案.注意到贡献答案的方式是每次选一个连续段,拿走后剩下的段拼起来继续段,所以转移就考虑从最后一次选的方法转移过来,那么最后一次选的是原序列的一个连续段中挖掉一些小连续段的一些段.设辅助状态\(g_{i,j,p,q}\)表示区间\([i,j]\)要选出一个连续段,其中最小值为\(p\),最大值为\(q\)的最小代价,转移可以在左右两边接上一个\(f_{i,j}\)(这一段不在最终段中),或者接上一个在段内的元素,并更新最大值/最小值.最后用\(g\)更新\(f\),大概为\(f_{i,j}=\min(a+g_{i,j,p,q}+b(q-p)^2)\)

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define uLL unsigned long long
  4. #define db double
  5. using namespace std;
  6. const int N=55,mod=1e9+7;
  7. int rd()
  8. {
  9. int x=0,w=1;char ch=0;
  10. while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
  11. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  12. return x*w;
  13. }
  14. int n,a,b,t,w[N],bb[N],f[N][N],g[N][N][N][N];
  15. int main()
  16. {
  17. n=rd(),a=rd(),b=rd();
  18. for(int i=1;i<=n;++i) w[i]=bb[i]=rd();
  19. sort(bb+1,bb+n+1),t=unique(bb+1,bb+n+1)-bb-1;
  20. for(int i=1;i<=n;++i) w[i]=lower_bound(bb+1,bb+t+1,w[i])-bb;
  21. memset(f,0x3f3f3f,sizeof(f)),memset(g,0x3f3f3f,sizeof(g));
  22. for(int i=1;i<=n;++i) f[i][i]=a,g[i][i][w[i]][w[i]]=0;
  23. for(int i=1;i<=n;++i)
  24. {
  25. g[i-1][i][w[i]][w[i]]=min(g[i-1][i][w[i]][w[i]],g[i][i][w[i]][w[i]]+f[i-1][i-1]);
  26. g[i][i+1][w[i]][w[i]]=min(g[i][i+1][w[i]][w[i]],g[i][i][w[i]][w[i]]+f[i+1][i+1]);
  27. int np=min(w[i],w[i-1]),nq=max(w[i],w[i-1]);
  28. g[i-1][i][np][nq]=min(g[i-1][i][np][nq],g[i][i][w[i]][w[i]]);
  29. np=min(w[i],w[i+1]),nq=max(w[i],w[i+1]);
  30. g[i][i+1][np][nq]=min(g[i][i+1][np][nq],g[i][i][w[i]][w[i]]);
  31. }
  32. for(int l=1;l<n;++l)
  33. for(int i=1,j=l+1;j<=n;++i,++j)
  34. {
  35. for(int p=1;p<=t;++p)
  36. for(int q=p;q<=t;++q)
  37. {
  38. for(int k=i;k<j;++k)
  39. g[i][j][p][q]=min(g[i][j][p][q],min(g[i][k][p][q]+f[k+1][j],g[k+1][j][p][q]+f[i][k]));
  40. int np=min(p,w[i-1]),nq=max(q,w[i-1]);
  41. g[i-1][j][np][nq]=min(g[i-1][j][np][nq],g[i][j][p][q]);
  42. np=min(p,w[j+1]),nq=max(q,w[j+1]);
  43. g[i][j+1][np][nq]=min(g[i][j+1][np][nq],g[i][j][p][q]);
  44. f[i][j]=min(f[i][j],a+g[i][j][p][q]+b*(bb[q]-bb[p])*(bb[q]-bb[p]));
  45. }
  46. }
  47. printf("%d\n",f[1][n]);
  48. return 0;
  49. }

loj 2292「THUSC 2016」成绩单的更多相关文章

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

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

  2. 2018.10.27 loj#2292. 「THUSC 2016」成绩单(区间dp)

    传送门 g[i][j][k][l]g[i][j][k][l]g[i][j][k][l]表示将区间l,rl,rl,r变成最小值等于kkk,最大值等于lll时的花费的最优值. f[i][j]f[i][j] ...

  3. 【LOJ】#2292. 「THUSC 2016」成绩单

    题解 神仙dp啊><(也有可能是我菜) 我们发现,想要拿一段区间的话,只和这个区间的最大值和最小值有关系,那么我们考虑,如果一个区间[l,r]我们拿走了一些数后,使它的最小值是a,最大值是 ...

  4. LOJ 2991 「THUSC 2016」补退选——trie+线段树合并或vector

    题目:https://loj.ac/problem/2291 想了线段树合并的做法.就是用线段树维护 trie 的每个点在各种时间的操作. 然后线段树合并一番,线段树维护前缀最大值,就是维护最大子段和 ...

  5. 「THUSC 2016」成绩单 & 方块消除 (区间dp)

    成绩单 $f[l][r][mi][mx]$表示从l到r发到还没发的部分的最小值为mi最大值为mx时的最小代价. $f[l][r][0][0]$表示从l到r全部发完的代价. 自己写的无脑dp,枚举中转点 ...

  6. loj2292 「THUSC 2016」成绩单

    ref 我是傻逼,我啥也不会,这是我抄的. #include <iostream> #include <cstring> #include <cstdio> usi ...

  7. 【LOJ】#2291. 「THUSC 2016」补退选

    题解 在trie树上开vector记录一下这个前缀出现次数第一次达到某个值的下标,以及记录一下现在这个前缀有多少个 为什么thusc有那么水的题--是为了防我这种cai ji爆零么= = 代码 #in ...

  8. loj2291 「THUSC 2016」补退选

    ref pkusc 快到了,做点 thusc 的题涨涨 rp-- #include <iostream> #include <cstring> #include <cst ...

  9. LOJ#2799. 「CCC 2016」生命之环

    题意 给你一个 \(n\) 个 \(\rm 01\) 组成的环,每次操作之后每个位置为1当且仅当他的左右恰好有1个1.输出进行 \(T\) 次操作之后的环. \(n\leq 10^5, T\leq 1 ...

随机推荐

  1. CDH构建大数据平台-Kerberos高可用部署【完结篇】

    CDH构建大数据平台-Kerberos高可用部署[完结篇] 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装Kerberos相关的软件包并同步配置文件 1>.实验环境 ...

  2. 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包

    参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架:src/main/java(javaz主代码)src/test ...

  3. SQL-W3School-基础:SQL AND & OR 运算符

    ylbtech-SQL-W3School-基础:SQL AND & OR 运算符 1.返回顶部 1. AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤. AND 和 OR 运算符 ...

  4. 利用socket实现聊天-Android端核心代码

    实体类与服务端报错一致,包括包名 package loaderman.im.bean; /** * 一个聊天消息的JavaBean * * */ public class ChatMsgEntity ...

  5. kotlin泛型中星号投射

    如果一个泛型类型中存在多个类型的参数,那么每个类型的参数都可以单独投射,例如:如果类型定义为:"interface Function<in T,out>",那么可以出现 ...

  6. MySQL中的sleep函数介绍

    MySQL数据库中有一个不太常用但便于进行某些调试的函数:sleep(),今天我们就来介绍一下这个函数的用法. 首先,看看官网对于函数的定义: SLEEP(duration)Sleeps (pause ...

  7. Node.js起一个web服务器

    开启服务: 代码如下: var http = require('http'); http.createServer(function (request, response) { // 发送 HTTP ...

  8. Spring Aop(一)——Aop简介

    转发地址:https://www.iteye.com/blog/elim-2394629 1 Aop简介 AOP的全称是Aspect Oriented Programming,翻译成中文是面向切面编程 ...

  9. SIFT学习笔记之二 特征提取

    特征提取函数: int _sift_features( IplImage* img, struct feature** feat, int intvls, double sigma, double c ...

  10. OpenCV.问题&解决

    ZC:PDF:D:\_eBook\OpenCV\学习OpenCV(中文版Linuxidc.com).pdf 1.函数cvCaptureFromAVI(...) & cvCreateFileCa ...