传送门

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]f[i][j]表示取掉区间l,rl,rl,r的最优值。

考虑ggg数组的转移。

g[i][j+1][min(k,w[j+1])][max(l,w[i+1])]=min(g[i][j+1][min(k,w[j+1])][max(l,w[i+1])],g[i][j][k][l])g[i][j+1][min(k,w[j+1])][max(l,w[i+1])]=min(g[i][j+1][min(k,w[j+1])][max(l,w[i+1])],g[i][j][k][l])g[i][j+1][min(k,w[j+1])][max(l,w[i+1])]=min(g[i][j+1][min(k,w[j+1])][max(l,w[i+1])],g[i][j][k][l])

g[i][t][k][l]=min(g[i][t][k][l],g[i][j]][k][l]+f[i+1][t])g[i][t][k][l]=min(g[i][t][k][l],g[i][j]][k][l]+f[i+1][t])g[i][t][k][l]=min(g[i][t][k][l],g[i][j]][k][l]+f[i+1][t])

然后再用ggg数组更新fff数组。

f[l][r]=min(f[l][r],g[l][r][k][l])f[l][r]=min(f[l][r],g[l][r][k][l])f[l][r]=min(f[l][r],g[l][r][k][l])

这样维护就行了。

注意dpdpdp之前离散化一下。

代码:

#include<bits/stdc++.h>
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;
}
const int N=55;
int n,a,b,f[N][N],g[N][N][N],w[N],x[N],tot=0;
int main(){
	n=read(),a=read(),b=read();
	for(int i=1;i<=n;++i)w[i]=x[i]=read();
	sort(x+1,x+n+1),tot=unique(x+1,x+n+1)-x-1;
	for(int i=1;i<=n;++i)w[i]=lower_bound(x+1,x+tot+1,w[i])-x;
	for(int i=1;i<=n;++i)f[i][i]=a;
	for(int len=2;len<=n;++len)for(int l=1,r=len;r<=n;++l,++r){
		for(int i=l;i<=r;++i)for(int j=tot;j;--j)for(int k=tot;k>=j;--k)g[i][j][k]=0x3f3f3f3f;
		g[l][w[l]][w[l]]=0;
		for(int i=l;i<r;++i)for(int j=tot;j;--j)for(int k=tot;k>=j;--k){
			if(g[i][j][k]==0x3f3f3f3f)continue;
			int&tmp=g[i+1][min(j,w[i+1])][max(k,w[i+1])];
			tmp=min(tmp,g[i][j][k]);
			for(int t=i+1;t<=r;++t)g[t][j][k]=min(g[t][j][k],g[i][j][k]+f[i+1][t]);
		}
		f[l][r]=0x3f3f3f3f;
		for(int i=tot;i;--i)for(int j=tot;j>=i;--j)f[l][r]=min(f[l][r],g[r][i][j]+a+b*(x[i]-x[j])*(x[i]-x[j]));
	}
	cout<<f[1][n];
	return 0;
}

2018.10.27 loj#2292. 「THUSC 2016」成绩单(区间dp)的更多相关文章

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

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

  2. loj 2292「THUSC 2016」成绩单

    loj 看着就很区间dp,所以考虑求\(f_{i,j}\)表示区间\([i,j]\)的答案.注意到贡献答案的方式是每次选一个连续段,拿走后剩下的段拼起来继续段,所以转移就考虑从最后一次选的方法转移过来 ...

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

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

  4. 2018.10.27 loj#6035. 「雅礼集训 2017 Day4」洗衣服(贪心+堆)

    传送门 显然的贪心题啊...考试没调出来10pts滚了妙的一啊 直接分别用堆贪心出洗完第iii件衣服需要的最少时间和晾完第iii件衣服需要的最少时间. 我们设第一个算出来的数组是aaa,第二个是bbb ...

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

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

  6. loj2292 「THUSC 2016」成绩单

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

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

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

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

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

  9. 2018.10.20 loj#2593. 「NOIP2010」乌龟棋(多维dp)

    传送门 f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示用iii张111,jjj张222,kkk张333,lll张444能凑出的最大贡献. 然后从f[i−1][j][ ...

随机推荐

  1. 通过location对象的某些属性得到一个完整URL的各个部分。

    I’m home. 我回来了. I’m lost. 我迷路了. This way. 这边请. After you. 您先. Bless you! 祝福你! 笔记: http://www.example ...

  2. string类的一些函数方法

    1.请查看String.equals()方法的实现代码,注意学习其实现方法: (1)源程序: public class StringEquals { /** * @param args the com ...

  3. vue 引用公共方法(例子:截取字符串固定字数,其余显示...)

    1.写公共js 2.main.js引入公共js 3.在组件中用this.common.方法名 引用

  4. UVa 548 Tree(二叉树最短路径)

    You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...

  5. Delphi: TLabel设置EllipsisPosition属性用...显示过长文本时,以Hint显示其全文本

    仍然是处理多语言中碰到问题. Delphi自2006版以后,TLabel有了EllipsisPosition属性,当长文本超过其大小时,显示以...,如下图: 这样虽然解决显示问题,但很显然,不知道. ...

  6. SpringBoot使用@Value从yml文件取值为空--注入静态变量

    SpringBoot使用@Value从yml文件取值为空--注入静态变量     1.application.yml中配置内容如下:   pcacmgr:   publicCertFilePath: ...

  7. Django xadmin后台添加富文本编辑器UEditor的用法

    效果图: 步骤: 1.利用命令:pip install DjangoUeditor,安装DjangoUeditor,但由于DjangoUeditor没有python3版本的,从的Github上把修改好 ...

  8. Head First Servlets & JSP 学习笔记 第四章 —— 作为Servlet

    Servlet的任务是得到一个客户的请求,再发回一个响应. 请求: 容器控制着Servlet的一生,它会创建请求和响应对象.为Servlet创建一个新线程或分配一个线程,另外调用Servlet的ser ...

  9. 4-windows 用cmd 如何输入命令 进入文件夹

    比如是你要到d盘的 tmp目录,那么敲入 cd d:\tmp 回车,然后在敲入 d:回车即可

  10. 纯css实现div中未知尺寸图片的垂直居中

    1.淘宝的方法 在曾经的"淘宝UED招聘"中有这样一道题目: “使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中.” 当然出题并不是 ...