【题解】Making The Grade(DP+结论)
【题解】Making The Grade(DP+结论)
HNOI-D2-T3 原题,禁赛三年。
或许是我做过的最简单的DP题了吧(一遍过是什么东西
)
之前做过关于绝对值的题目,这种要求绝对值最小的题目,有一个很普遍的结论,最优解的集合中,一定有一个满足所有元素一定是所给定的元素中的元素,具体证明或许就是把括号拆开或者反证法吧。
然后就是这种看起来是\(O(n^3)\)的DP可以通过巧妙的实现降到\(O(n^2)\),当然你暴力使用数据结构变成\(O(n^2\log n)\)也随便你(但是我暂时不会,因为还没有仔细思考,但求高手解答)。
考虑后面选择的内容和前面选择的内容是最优子结构,所以考虑DP
直接问什么求什么\(dp(i,j)\)表示对于第\(i\)个数字,我们拿\(j\)(数值)进行匹配,这样我们转移就太简单了
\]
初始化什么的没有难度就不说了,然而值域很大,但是值域不影响转移,我们只关心大小,到时候统计答案的时候再还原就好了。
//@winlere
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57) f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=2e3+5;
int n;
uint A[maxn];
uint sav[maxn];
int cnt;
ll dp[maxn][maxn];
inline ll retans(const ll&a,const ll&b){
ll t1=a-b;
if(t1<0)return -t1;
return t1;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=qr();
memset(dp,0x3f,sizeof dp);
for(register int t=1;t<=n;++t)
sav[t]=A[t]=qr();
sort(sav+1,sav+n+1);
cnt=unique(sav+1,sav+n+1)-sav-1;
for(register int t=1;t<=n;++t)
A[t]=lower_bound(sav+1,sav+cnt+1,A[t])-sav;
memset(dp[0],0,sizeof dp[0]);
for(register int t=1;t<=n;++t){
int mini=0;
for(register int i=1;i<=cnt;++i){
if(!mini || dp[t-1][mini]>dp[t-1][i]) mini=i;
dp[t][i]=min(dp[t][i],dp[t-1][mini]+retans(sav[A[t]],sav[i]));
//cout<<t<<' '<<i<<' '<<dp[t][i]<<' '<<mini<<endl;
}
}
ll ans=0xffffffffff;
for(register int t=1;t<=cnt;++t)
ans=min(ans,dp[n][t]);
cout<<ans<<endl;
return 0;
}
【题解】Making The Grade(DP+结论)的更多相关文章
- 【题解】POJ1934 Trip (DP+记录方案)
[题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...
- 【题解】剪纸条(dp)
[题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回 ...
- 【题解】地精部落(DP)
[题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...
- CF719C. Efim and Strange Grade[DP]
C. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...
- POJ3666Making the Grade[DP 离散化 LIS相关]
Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6445 Accepted: 2994 ...
- poj 3666 Making the Grade(dp)
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- 【bzoj1369】[Baltic2003]Gem(树形dp+结论)
题目传送门:bzoj1369 这题其实有个结论:节点数为n的树,对其染色使相邻节点颜色不同,且总颜色权值最小,所需的颜色数量是$ O(\log n) $的. 所以我们就可以愉快的dp了:$ f[i][ ...
- POJ3666 Making the Grade [DP,离散化]
题目传送门 Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9090 Accepted: ...
随机推荐
- Topcoder SRM 664 DIV 1
BearPlays 快速幂 题意: 给你两个数A,B,有种操作是将大的数减去小的数,并将小的数乘以2.反复k次,问你最后的小的数回是多少. 题解: 由于整个过程$A+B$的值是不会改变的.现在令$S= ...
- IDEA阅读源码的技巧
目录 1. 查看当前类内容 2. 查看当前类的继承体系 3. 查看当前方法的调用链 本教程仅支持 MAC 系统下的 IDEA 开发工具,如果需要 Windows 对应的操作起自行替代相应快捷键即可. ...
- 块级元素和行内元素的区别 (block vs. inline)
块级元素 (display: block) 独占一行,多个block元素会各自新起一行.默认情况下,block元素的宽度会填满父元素的宽度. 可以设置width, height属性.但是,即使设置了w ...
- Win7下搭建外网环境的SVN服务器
最近想跟一帮朋友做点东西,由于几个朋友都身处异地,要想实现版本控制,只能自己搭建一个小的服务器,通过互联网环境来实现版本控制了.本来也在网上找了好多资料,但是总是缺少一些必要的信息,导致最后连接不上服 ...
- LeetCode OJ 之 Ugly Number (丑数)
题目: Write a program to check whether a given number is an ugly number. Ugly numbers are positive num ...
- [Golang] 从零開始写Socket Server(2): 自己定义通讯协议
在上一章我们做出来一个最基础的demo后,已经能够初步实现Server和Client之间的信息交流了~ 这一章我会介绍一下怎么在Server和Client之间实现一个简单的通讯协议.从而增强整个信息交 ...
- TSRC挑战赛:WAF之SQL注入绕过挑战实录
转自腾讯 博文作者:TSRC白帽子 发布日期:2014-09-03 阅读次数:1338 博文内容: 博文作者:lol [TSRC 白帽子] 第二作者:Conqu3r.花开若相惜 来自团队:[Pax.M ...
- TCP/IP详解 卷一(第一章 概述)
很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但TCP/IP协议族允许它们相互进行通信. 1.分层 TCP/IP不是一个协议,而是一个协议族,通常它被认为是一个四层的协议系统,下面展 ...
- cocos2dx3.x使用cocostudio触摸事件不响应的奇葩问题
刚刚使用3.1,发现了一些关于触摸的不同之处,对于习惯于2.x的人还是认为坑啊,简单总结一下: 使用cocostudio加进来的ui,当某个可触但不可见的时候,给他加入不论什么触摸监听事件都是依照不可 ...
- 常用组件介绍 ---- Layout_weight
下面这些也可以算是组件 文本区 TextView 文本框 EditText layout 容器 view 千万不要把Layout_weight 与 Layout_width相混淆**** ...