BZOJ 4897: [Thu Summer Camp2016]成绩单 动态规划
Description
Input
Output
这是一个非常神仙的区间 DP.
令 $g[l][r][i][j]$ 表示将区间 $[l,r]$ 删至所有权值都在 $[i,j]$ 之内的最小代价.
令 $f[l,r]$ 表示将 $[l,r]$ 区间全部删掉的最小代价.
上一次的更新更新完了 $r-1$,所以说 $g[l][r-1]$ 都是可以用于更新 $g[l][r]$ 的.
考虑新加入 $r$, 那么要分成两种情况:
1. 没有被删掉,即和权值在 $[i,j]$ 之内的连续子序列构成了一个新的序列.
2. 被删掉,即 $r$ 不会影响到任何决策.
写成状态转移:
1. $g[l][r-1][i][j]\Rightarrow g[l][r][min(i,w[r])][max(j,w[r])]$
2. $g[l][k][i][j]+f[k+1][r]\Rightarrow g[l][r][i][j]$
由于这是区间 $DP$,所以区间长度更小的已经被解决掉了,所以转移是完全合法的.
动态规划的一个小窍门就是每次可以指定什么什么东西,比如这次就指定了每次只加入右端点.
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 52
#define setIO(s) freopen(s".in", "r" , stdin)
int w[N], v[N], f[N][N], g[N][N][N][N];
inline void getmin(int &a, int b)
{
if(b < a) a = b;
}
int main()
{
// setIO("input");
int n, A, B, i, j, len;
scanf("%d%d%d", &n , &A, &B), memset(f, 0x3f, sizeof(f)), memset(g, 0x3f, sizeof(g));
for(i = 1; i <= n ; ++ i) scanf("%d", &w[i]), v[i] = w[i];
std :: sort(v + 1, v + 1 + n);
for(i = 1; i <= n ; ++ i)
{
w[i] = std :: lower_bound(v + 1, v + 1 + n, w[i]) - v;
f[i][i] = A, g[i][i][w[i]][w[i]] = 0;
}
for(len = 2; len <= n ; ++ len)
{
int l, r, k;
for(l = 1; l + len - 1 <= n ; ++ l)
{
r = l + len - 1;
for(i = 1; i <= n ; ++ i)
{
for(j = i; j <= n ; ++ j)
getmin( g[l][r][std :: min(i, w[r])][std :: 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)
getmin(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)
getmin(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;
}
BZOJ 4897: [Thu Summer Camp2016]成绩单 动态规划的更多相关文章
- BZOJ.4897.[Thu Summer Camp2016]成绩单(区间DP)
BZOJ 显然是个区间DP.令\(f[l][r]\)表示全部消掉区间\([l,r]\)的最小花费. 因为是可以通过删掉若干子串来删子序列的,所以并不好直接转移.而花费只与最大最小值有关,所以再令\(g ...
- BZOJ4897: [Thu Summer Camp2016]成绩单【DP of DP】
Description 期末考试结束了,班主任L老师要将成绩单分发到每位同学手中.L老师共有n份成绩单,按照编号从1到n的顺序叠 放在桌子上,其中编号为i的成绩单分数为w_i.成绩单是按照批次发放的. ...
- 【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp
题目描述 给你一个数列,每次你可以选择连续的一段,付出 $a+b\times 极差^2$ 的代价将其删去,剩余部分拼到一起成为新的数列继续进行此操作.求将原序列全部删去需要的最小总代价是多少. 输入 ...
- bzoj4897 [Thu Summer Camp2016]成绩单
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4897 [题解] 第一次看这题想的是f[l,r]的区间dp发现仅记录这两个好像不能转移啊 会出 ...
- BZOJ4897 [Thu Summer Camp2016]成绩单 【dp】
题目链接 BZOJ4897 题解 发现我们付出的代价与区间长度无关,而与区间权值范围有关 离散化一下权值 我们设\(f[l][r][x][y]\)表示区间\([l,r]\)消到只剩权值在\([x,y] ...
- BZOJ 4896: [Thu Summer Camp2016]补退选
trie树+vector+二分 别忘了abs(ans) #include<cstdio> #include<algorithm> #include<vector> ...
- BZOJ 4896 :[Thu Summer Camp2016]补退选 Trie树+Vector
4896: [Thu Summer Camp2016]补退选 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 315 Solved: 97[Submi ...
- 【BZOJ4896】[Thu Summer Camp2016]补退选 Trie树
[BZOJ4896][Thu Summer Camp2016]补退选 Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 ...
- bzoj 3522 / 4543 [POI 2014] Hotel - 动态规划 - 长链剖分
题目传送门 bzoj 3522 需要root权限的传送点 bzoj 4543 快速的传送点 慢速的传送点 题目大意 给定一棵树,问有多少个无序三元组$(x, y, z)$使得这三个不同点在树上两两距离 ...
随机推荐
- 【神经网络与深度学习】【VS开发】【CUDA开发】VS2013 配置CUDNN V4 DEMO
VS2013 配置CUDNN V4 DEMO 众所周知,当前主流深度学习的实现中调用的底层API都是cudnn,自己做项目需要开发深度学习模块时,也需要调用cudnn库,因此熟悉cudnn库是很有必要 ...
- Linux集群之间配置NTP时间同步ntp
NTP时间同步 注意事项 要注意的是,ntpd 有一个自我保护设置: 如果本机与上源时间相差太大, ntpd 不运行. 所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ...
- 思考-继续思考在数据库中两个表join的问题
##在资源有限的情况下,如何做两个大表的join? --- 假设系统资源:内存1G,大表10G,小表2G. --- 都拿到内存中进行笛卡尔集肯定不行,内存没有那么大. 最简单的办法是对两个表建索引,但 ...
- oracle ojdbc 版本须对应,否则日期字段查询结果与实际值可能不一致
1. 数据库版本:select * from v$version; 2. 版本对应:
- 初步学习jquery学习笔记(二)
jQuery事件 jquery是为事件处理而设计的 什么是事件? 页面对不同访问者的相应叫做事件. 事件处理程序指的是html中发生某些事件所调用的方法 实例: 在元素上移动鼠标 选取单选按钮 点击元 ...
- 关于c++对拍的办法
众所周知,在\(oi\)学习以及考试中,对拍是一件非常重要的事. 有了对拍后,我们可以利用它发现代码上的一些非常难看出来的错误. 编写对拍程序一般有两个办法. 方案一 编写一个对拍的\(cpp\),并 ...
- PHPStorm运行PHP代码
1.完成php代码后,点击空白处,右上角会出现 chrome.firefox等浏览器的图标,选择一个电脑上已有图标 2.默认情况下浏览器会提示“bad gateway”,此时需要配置phpstorm对 ...
- 软考题型—PERT图(项目计划评审技术)
经历过软件危机和大量软件项目的失败,人们对软件工程产业现状进行分析后,得出普遍性结论便是:软件项目成功率低的原因很可能就是项目管理能力太弱.由于软件本身的特殊性和复杂性,将项目管理思想引入软件工程领域 ...
- Git-版本控制 (三)
前面两篇我们成功安装了Git,并且成功创建了我们的版本库. 创建了版本库,怎么可以不往里面放内容呢,所以今天的任务就是学会将文件放入至我们的版本库中...... 首先,我们点开我们的"Git ...
- mysql数据库常见错误代码列表
mysql出错代码列表1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1 ...