题目

LOJ2292

分析

比较神奇的一个区间 DP ,我看了很多题解都没看懂,大约是我比较菜罢。

先明确一下题意:abcde 取完 c 后变成 abde ,可以取 bd 这样取 c 后新增的连续段。因此这题需要区间 DP。

能发现取一段区间的代价只与这段区间的最大值和最小值有关。那么用 \(f_{i,j,l,r}\) 表示将区间 \([i,j]\) 取到只剩下值在 \([l,r]\) 中的数的最小代价,\(g_{i,j}\) 表示取完区间 \([i,j]\) 的最小代价,则 \(g_{1,n}\) 就是答案。

考虑怎么转移。对于一段区间而言,取区间末尾的那个数不会创造出新的连续段,也就是说不存在一步必须要取完末尾的数才能取到。因此末尾的数一定可以最后一步再取。那么大力枚举末尾的数是和前面多少个数一起取的,就有转移:

\[f_{i,j,l,r}=\min_{k=i+1}^j f_{i,k-1,l,r}+g_{k,j}
\]

此外,如果末尾的数在 \([l,r]\) 中,那么也可以不取。此时有转移:

\[f_{i,j,l,r}=f_{i,j-1,l,r}
\]

\(g\) 的转移就是枚举取最后一步时剩下的最大值和最小值,然后加上取这一次的代价。即:

\[g_{i,j}=\min_{l=1}^{m}\min_{r=l}^m f_{i,j,l,r}+a+b(r-l)^2
\]

其中 \(m\) 是权值的最大值。

离散化后时间复杂度 \(O(n^5)\) 。

代码

#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std; namespace zyt
{
const int N = 55, INF = 0x3f3f3f3f;
int n, a, b, f[N][N][N][N], g[N][N], arr[N], tmp[N];
int sq(const int x)
{
return x * x;
}
int work()
{
memset(f, INF, sizeof(f));
memset(g, INF, sizeof(g));
scanf("%d%d%d", &n, &a, &b);
for (int i = 1; i <= n; i++)
scanf("%d", &arr[i]), tmp[i] = arr[i];
sort(tmp + 1, tmp + n + 1);
int cnt = unique(tmp + 1, tmp + n + 1) - tmp - 1;
for (int i = 1; i <= n; i++)
arr[i] = lower_bound(tmp + 1, tmp + cnt + 1, arr[i]) - tmp;
for (int i = 1; i <= n; i++)
memset(f[i][i - 1], 0, sizeof(f[i][i - 1]));
for (int len = 1; len <= n; len++)
for (int i = 1; i + len - 1 <= n; i++)
{
int j = i + len - 1;
for (int l = 1; l <= cnt; l++)
for (int r = l; r <= cnt; r++)
{
if (l <= arr[j] && arr[j] <= r)
f[i][j][l][r] = min(f[i][j][l][r], f[i][j - 1][l][r]);
for (int k = i + 1; k <= j; k++)
f[i][j][l][r] = min(f[i][j][l][r], f[i][k - 1][l][r] + g[k][j]);
}
for (int l = 1; l <= cnt; l++)
for (int r = l; r <= cnt; r++)
g[i][j] = min(g[i][j], f[i][j][l][r] + a + b * sq(tmp[r] - tmp[l]));
}
printf("%d", g[1][n]);
return 0;
}
}
int main()
{
return zyt::work();
}

【LOJ2292】[THUSC2016]成绩单(区间DP)的更多相关文章

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

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

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

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

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

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

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

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

  5. [LOJ2292] [THUSC2016] 成绩单

    题目链接 LOJ:https://loj.ac/problem/2292 洛谷:https://www.luogu.org/problemnew/show/P5336 Solution 区间\(\rm ...

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

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

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

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

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

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

  9. 区间dp提升复习

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

随机推荐

  1. Opentrains 1519 G——最小圆覆盖

    题目 给出 $n$ 个定义在区间 $[0, 1]$ 上的一次函数 $f_i(x) = a_ix+b_i$,定义两个函数的距离为: $$dist(f,g) = \left(\max_{0\leq i\l ...

  2. windows node版本管理工具nvm

    有时候,不同的项目需要使用不同的node版本.我们可以使用nvm管理不同的node版本.具体使用方法如下: 1.下载安装nvm 点击我下载nvm 解压下载的文件,双击nvm-setup.exe 直接下 ...

  3. WinDbg常用命令系列---!runaway

    简介 !runaway扩展显示有关每个线程使用的时间的信息. 使用形式 !runaway [Flags] 参数 Flags指定要显示的信息类型. 标志可以是以下位的任意组合. 默认值为 0x1.位 0 ...

  4. Linux查看文件的权限

    Linux查看权限命令: ls -l 文件或文件夹 输出结果示例: 这里是查看tomcat文件夹中所有子文件或者子文件夹的权限,以列表的形式列出. 关于列表的每列所代表的含义参见我的另外一篇博客:Li ...

  5. Mac版最详细的Flutter开发环境搭建

    上周任务不多,闲来无事想学习一下flutter耍一耍,发现flutter的环境搭建步骤还是很繁琐的,官网的搭建教程只是按步骤让你进行操作,中间出现的问题完全没有提及,对我这种没搞过原生开发的小白来说超 ...

  6. svn无法还原 、svn无法更新

    报错:  Previous operation has not finished; run 'cleanup' if it was interrupted 上一个操作尚未完成:如果中断,请运行“清理”

  7. 【技术博客】 关于laravel5.1中文件上传测试的若干尝试

    关于laravel5.1中文件上传测试的若干尝试 作者:ZGJ 版本:v1.0 PM注:本人这两天也正在尝试解决这一问题,如有进展将及时更新这一博客 在我们的软工第二阶段中,我开始着手进行后端控制器的 ...

  8. visual studio 2019 企业版下载

    由于visual studio从2017开始就是网络下载安装,所以网速慢的朋友安装上就存在时间感,所以笔者在百度云上提供了visual studio 2019的下载包.需要的朋友自己下载安装.不过,2 ...

  9. 认真分析mmap:是什么 为什么 怎么用(转)

    阅读目录 mmap基础概念 mmap内存映射原理 mmap和常规文件操作的区别 mmap优点总结 mmap相关函数 mmap使用细节 回到顶部 mmap基础概念 mmap是一种内存映射文件的方法,即将 ...

  10. 【PHP】php实现二进制、八进制、十进制、十六进制之间各自转换的函数

    <?php /* 常见的进制: 二进制 binary -----> bin 八进制 octal -----> oct 十进制 decimal -----> dec 十六进制 h ...