题目描述

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

输入

第一行包含一个正整数n,表示成绩单的数量。
第二行包含两个非负整数a,b,表示给定的评估参数。
第三行包含n个正整数w_i,表示第i张成绩单上的分数。

输出

仅一个正整数,表示最小的代价是多少。

样例输入

10
3 1
7 10 9 10 6 7 10 7 1 2

样例输出

15


题解

区间dp

对于这种删除连续一段,剩下的拼到一起的问题:把操作对应到原序列上,相当于一些要么包含要么相离的操作。

相离的情况显然是区间dp,设 $f[l][r]$ 表示将原序列的 $[l,r]$ 全部删掉所需的最小总代价。

对于包含的情况,也可以使用区间dp来解决。具体方法是:同时维护转移到一半时的状态。如下图(先删b~c再删a~d):

记录从a转移到b的状态,dp得知bc可以用某代价消掉,进而推知a转移到c的状态,继续转移到d即可。

由于极差之和最大值与最小值有关,因此离散化后设 $g[l][r][i][j]$ 表示将 $[l,r]$ 删至剩下的数最小值为 $i$ ,最大值为 $j$ 的最小代价。

那么每次dp区间 $[l,r]$ ,最后一个位置 $r$ 的转移有两种情况:

  1. 和前面的 $[l,r-1]$ 放到一起删除,这样的话 $r$ 会影响最小值与最大值,相应的有 $g[l][r][\text{min}(i,w[r])][\text{max}(i,w[r])]=g[l][r-1][i][j]$ ;
  2. 和后面的某一段 $[k+1,r]$ 作为被包含的子区间删除,这样的话枚举 $k$ ,有 $g[l][r][i][j]=g[l][k][i][j]+f[k+1][r]$ 。

处理完这个区间的 $g[l][r][][]$ 后处理 $f[l][r]$ ,显然依题意有 $f[l][r]=g[l][r][i][j]+a+b\times(j-i)^2$ 。

最后的答案就是 $f[1][n]$ 。

时间复杂度 $O(n^5)$ ,常数极小可以通过。

注意边界问题什么的。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int w[52] , v[52] , f[52][52] , g[52][52][52][52];
inline void gmin(int &x , int y)
{
x > y ? x = y : 0;
}
int main()
{
int n , a , b , len , i , j , k , l , r;
scanf("%d%d%d" , &n , &a , &b);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &w[i]) , v[i] = w[i];
sort(v + 1 , v + n + 1);
memset(f , 0x3f , sizeof(f)) , memset(g , 0x3f , sizeof(g));
for(i = 1 ; i <= n ; i ++ ) w[i] = lower_bound(v + 1 , v + n + 1 , w[i]) - v , g[i][i][w[i]][w[i]] = 0 , f[i][i] = a;
for(len = 2 ; len <= n ; len ++ )
{
for(l = 1 ; l <= n - len + 1 ; l ++ )
{
r = l + len - 1 , g[l][r][w[r]][w[r]] = f[l][r - 1];
for(i = 1 ; i <= n ; i ++ )
for(j = i ; j <= n ; j ++ )
gmin(g[l][r][min(i , w[r])][max(j , w[r])] , g[l][r - 1][i][j]);
for(k = l ; k < r ; k ++ )
for(i = 1 ; i <= n ; i ++ )
for(j = i ; j <= n ; j ++ )
gmin(g[l][r][i][j] , g[l][k][i][j] + f[k + 1][r]);
for(i = 1 ; i <= n ; i ++ )
for(j = i ; j <= n ; j ++ )
gmin(f[l][r] , g[l][r][i][j] + a + b * (v[j] - v[i]) * (v[j] - v[i]));
}
}
printf("%d\n" , f[1][n]);
return 0;
}

【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp的更多相关文章

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

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

  2. BZOJ4897: [Thu Summer Camp2016]成绩单【DP of DP】

    Description 期末考试结束了,班主任L老师要将成绩单分发到每位同学手中.L老师共有n份成绩单,按照编号从1到n的顺序叠 放在桌子上,其中编号为i的成绩单分数为w_i.成绩单是按照批次发放的. ...

  3. BZOJ4897 [Thu Summer Camp2016]成绩单 【dp】

    题目链接 BZOJ4897 题解 发现我们付出的代价与区间长度无关,而与区间权值范围有关 离散化一下权值 我们设\(f[l][r][x][y]\)表示区间\([l,r]\)消到只剩权值在\([x,y] ...

  4. bzoj4897 [Thu Summer Camp2016]成绩单

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4897 [题解] 第一次看这题想的是f[l,r]的区间dp发现仅记录这两个好像不能转移啊 会出 ...

  5. BZOJ 4897: [Thu Summer Camp2016]成绩单 动态规划

    Description 期末考试结束了,班主任L老师要将成绩单分发到每位同学手中.L老师共有n份成绩单,按照编号从1到n的顺序叠 放在桌子上,其中编号为i的成绩单分数为w_i.成绩单是按照批次发放的. ...

  6. [THUSC2016]成绩单 [区间dp]

    简单区间dp. 考虑 \(f_{i,j,mn,mx}\)表示 \(i,j\) 区间的最大值为 \(mx\),最小值为 \(mn\) 的最小花费,\(g_{i,j}\) 为删掉 \([i,j]\) 的最 ...

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

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

  8. 区间dp提升复习

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

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

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

随机推荐

  1. 通过unixODBC访问PostgreSQL数据库

    磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页    回到顶级页面:PostgreSQL索引页[作者 高健@博客园  luckyjackgao@g ...

  2. flume 安装过程记录

    1.安装jdk 2.下载安装包 : apache-flume-1.7.0-bin.tar.gz 安装包是在win下载的,需要拖动到ubuntu下的/home/hadoop (拖动不了需要先安装  lr ...

  3. MAVEN相关文章

    Maven入门指南① :Maven 快速入门及简单使用 Maven入门指南② :Maven 常用命令,手动创建第一个 Maven 项目 Maven入门指南③:坐标和依赖 Maven入门指南④:仓库 M ...

  4. Windows环境下php开启GD库的方法

    一.GD库是什么? GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印.在网站上GD库通常用来生成缩略图,或者用来对图片加 ...

  5. 常用SQL语句大全(SQL Server)

    一.基础       查看数据库状态 select state_desc from sys.databases where name='dbname'  -- dbname数据库名 1.说明:创建数据 ...

  6. 1035 Password (20 分)(字符串)

    注意下单复数 #include<bits/stdc++.h> using namespace std; pair<string,string>pa; int main() { ...

  7. PHP学习和使用总结

    起因 学习和使用PHP也有不少年头了,而自己也在学习和使用其他许多语言.我想通过这个总结来给自己一个交代.另一方面也分享一下开发经验,如何用PHP开发和管理大型的项目. 闲聊 许多人说自己1天学会PH ...

  8. 第五次ScrumMeeting博客

    第五次ScrumMeeting博客 本次会议于10月29日(日)22时整在3公寓725房间召开,持续15分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕. 1. 每个人的工作(有Issue的内容和 ...

  9. ES6的新特性(10)——Class 的基本语法

    Class 的基本语法 简介 JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子. function Point(x, y) { this.x = x; this.y ...

  10. USACO 3.2.6 Sweet Butter 香甜的黄油(最短路)

    Description 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他 ...