NamoCamp 每日一题 体育节 区间DP
|–>题目传送门<–|
题目描述
学生会正在为体育节的接力赛做准备。学生会由 n个成员组成,他们将在比赛中一个一个地跑,第 i i i 个人的速度是 s i si si,第 i次接力会产生一个差异值 d i d_i di,它的值是前 i i i个参与接力赛的人的速度最大值与最小值的差,也就是说,我们假设第 i i i个参与比赛的人的速度是 a i a_i ai,那么 d i = max ( a 1 , a 2 , . . . , a i ) − min ( a 1 , a 2 , . . . , a i ) d_i =\max(a_1,a_2,...,a_i) - \min(a_1,a_2,...,a_i) di=max(a1,a2,...,ai)−min(a1,a2,...,ai)。现在你可以任意安排参加比赛的人的顺序,一个人只能参与一次,且每个人都必须参与,请你求出 d 1 + d 2 + . . . + d n d_1+d_2+...+d_n d1+d2+...+dn的最小值。
题解
首先考虑插入数字 a [ i ] a[i] a[i]的影响:
- 如果 a [ i ] a[i] a[i]是区间 max \max max,那么新增 a [ i ] − m i n b e f o r e a[i] - min_{before} a[i]−minbefore
- 如果 a [ i ] a[i] a[i]是区间 min \min min,那么新增 m a x b e f o r e − a [ i ] max_{before} - a[i] maxbefore−a[i]
- 如果都不是,那么新增 m a x b e f o r e − m i n b e f o r e max_{before} - min_{before} maxbefore−minbefore
那么显然,每插入一个区间最大值,新增极差的大小都会 u p up up,从贪心的角度考虑,我们应当尽可能晚的插入区间最大值。所以我们可以先对所有的 a i a_i ai排序。
设 d p [ l ] [ r ] dp[l][r] dp[l][r]表示区间 [ l , r ] [l,r] [l,r]的答案(和的最小值)。
考虑一段区间 [ l , r ] [l, r] [l,r]的状态:显然可以由( c o n ( x ) con(x) con(x)表示 x x x的贡献):
- c o n ( a [ l ] ) + d p [ l + 1 ] [ r ] con(a[l]) + dp[l + 1][r] con(a[l])+dp[l+1][r]
- c o n ( a [ r ] ) + d p [ l ] [ r − 1 ] con(a[r]) + dp[l][r - 1] con(a[r])+dp[l][r−1]
两个状态转移而来。同时由于我们对整个序列进行过排序,那么可以得知:
c o n ( a [ l ] ) = c o n ( a [ r ] ) = ( a [ r ] − a [ l ] ) con(a[l]) = con(a[r]) = (a[r] - a[l]) con(a[l])=con(a[r])=(a[r]−a[l])
那么可以直接跑一个区间 d p dp dp,计算答案即可。
#include <bits/stdc++.h>
#define int long longconst int N = 2e3 + 10;
int a[N], dp[N][N];inline bool cmp(const int &a, const int &b){ return a < b; }inline void solve(){int n = 0; std::cin >> n;for(register int i = 1; i <= n; i++) std::cin >> a[i];std::sort(a + 1, a + 1 + n, cmp);for(int len = 2; len <= n; len++){for(int l = 1; l <= n; l++){int r = l + len - 1;if(r > n) continue;dp[l][r] = (a[r] - a[l]) + std::min(dp[l + 1][r], dp[l][r - 1]); }}std::cout << dp[1][n] << std::endl;
}signed main(){solve();return 0;
}
NamoCamp 每日一题 体育节 区间DP相关推荐
- NamoCamp 每日一题 namonamo 折半搜索
|–>传送门<–| 题目大意 给定一个长度是偶数,仅有小写字母构成的字符串,判断是否能被分成两个完全相同的子序列.(字符串长度 1 ≤ ∣ s ∣ ≤ 40 1 \leq |s| \leq ...
- HDU 5115 (区间DP)
题目大意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼 ...
- P1063 能量项链(C++_区间dp)
题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...
- 【leetcode】最长回文子串(区间dp)
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...
- 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)
题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...
- 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★
P3147 [USACO16OPEN]262144 P 想到合并,自然就想到区间dp,一个被合成的数之前是一个区间,并且由两个数比它小 111 的区间合成.可麻烦的是,我们并不知道之前的两个区间长度各 ...
- 合并石子 区间dp水题
合并石子 链接: nyoj 737 描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N- ...
- 区间dp——cf1025D二叉搜索树的中序遍历好题!
这题帮我复习了一下BST的中序遍历.. 因为给定的数组是递增的,那么BST的中序遍历一定是1 2 3 4 5 6 7 8 9 ... n 即[l,r]为左子树,那么根节点就是r+1,反之根节点就是l- ...
- 刷题周记(八)——#区间DP:多边形、清空字符串 #状态机:股票买卖I~V、大盗阿福
文章目录 --2020年12月13日(周日)------------------ #区间DP 一.多边形 --2020年12月14日(周一)------------------ --2020年12月1 ...
最新文章
- 2021年春季学期-信号与系统-第十二次作业参考答案
- 中文乱码,也许这个小技巧可以帮到你
- 我的简书两月记:数据可视化
- ClickHouse | MergeTree引擎之数据分区
- 3d max 安装和导入rvt模型失败
- 验证Vsphere 5 支持大于2TB磁盘
- MySQL索引背后的数据结构及算法原理(employees实例)
- 又被ESLint 调戏了!!! ESLint:Newline required at end of file but not found. eslint(eol-last) [12, 22]
- [PHP] - Laravel - CSRF token禁用方法与排除验证csrf_token的url设置
- linux网络完全与防护
- 王庆的边缘计算(第一章)
- C++代码字符舞-极乐净土
- f1c100A运行linux,荔枝派 Nano 全志 F1C100s 编译运行 Linux 笔记
- 劳易测BPS300i SM 100条码定位
- excel文件修复工具_Excel文件打开后出错,部分内容丢失的修复技巧
- wpsmac和pc版的区别_Mac系统下金山WPS和微软Office 哪个更好更好用
- CCS 2021 | 自动化网络流量分析新方向
- java since,javadoc:@version和@since
- 轩小陌的Python笔记-day03 Python基础
- Apex英雄手游国服何时上线 Apex英雄手游和端游互通吗