【题解】Making The Grade(DP+结论)

VJ:Making the Grade

HNOI-D2-T3 原题,禁赛三年。

或许是我做过的最简单的DP题了吧(一遍过是什么东西)

之前做过关于绝对值的题目,这种要求绝对值最小的题目,有一个很普遍的结论,最优解的集合中,一定有一个满足所有元素一定是所给定的元素中的元素,具体证明或许就是把括号拆开或者反证法吧。

然后就是这种看起来是\(O(n^3)\)的DP可以通过巧妙的实现降到\(O(n^2)\),当然你暴力使用数据结构变成\(O(n^2\log n)\)也随便你(但是我暂时不会,因为还没有仔细思考,但求高手解答)。

考虑后面选择的内容和前面选择的内容是最优子结构,所以考虑DP

直接问什么求什么\(dp(i,j)\)表示对于第\(i\)个数字,我们拿\(j\)(数值)进行匹配,这样我们转移就太简单了

\[dp(i,j)=min\{dp(i-1,x|x<j)+|A_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+结论)的更多相关文章

  1. 【题解】POJ1934 Trip (DP+记录方案)

    [题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...

  2. 【题解】剪纸条(dp)

    [题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回 ...

  3. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  4. 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 ...

  5. POJ3666Making the Grade[DP 离散化 LIS相关]

    Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6445   Accepted: 2994 ...

  6. poj 3666 Making the Grade(dp)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  7. bzoj 2669 题解(状压dp+搜索+容斥原理)

    这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...

  8. 【bzoj1369】[Baltic2003]Gem(树形dp+结论)

    题目传送门:bzoj1369 这题其实有个结论:节点数为n的树,对其染色使相邻节点颜色不同,且总颜色权值最小,所需的颜色数量是$ O(\log n) $的. 所以我们就可以愉快的dp了:$ f[i][ ...

  9. POJ3666 Making the Grade [DP,离散化]

    题目传送门 Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9090   Accepted: ...

随机推荐

  1. Codeforces 869 C The Intriguing Obsession

    题目描述 — This is not playing but duty as allies of justice, Nii-chan! — Not allies but justice itself, ...

  2. 查看tomcat启动文件都干点啥---Catalina.java

    在前一章查看tomcat启动文件都干点啥---Bootstrap.java中我们得出结论,在Bootstrap中通过反射调用Catalina类中的getServer,start,stop,stopSe ...

  3. 调整type="file"时的input的

    <input type="file"> 在ie下的视图如下 而在firefox下的是 一般为了界面美化的效果,会将其设置为透明,然后覆盖一个<a href = & ...

  4. 如何从底层调试docker

    How the docker container creation process works (from docker run to runc) Over the past few months I ...

  5. TensorFlow笔记六:基于cifar10数据库的AlexNet识别

    准确率只有70%,cpu版本的TF居然跑了两天才跑完,其他方法将继续尝试. 生成数据目录: import numpy as np import os train_label = {} for i in ...

  6. shell程序

    例一:helloworld #!/bin/sh -x message="hello" read name echo "$message ,$name" 例二:选 ...

  7. hdu1198Farm Irrigation(dfs找联通)

    题目链接: 啊哈哈,选我选我 思路是:首先依据图像抽象出联通关系.. 首先确定每一种图形的联通关系.用01值表示不连通与不连通... 然后从第1个图形进行dfs搜索.假设碰到两快田地能够联通的话那么标 ...

  8. Shell脚本之:变量

    与编译型语言不同,shell脚本是一种解释型语言. 执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code), ...

  9. XML基础知识学习

    概念: XML 指可扩展标记语言 XML 是一种标记语言,非常类似 HTML ,文本文件. XML 的设计宗旨是数据传输,而非显示数据 .存储和传输复杂的关系模型数据 XML 标签没有被提前定义 使用 ...

  10. 重读金典------高质量C编程指南(林锐)-------第五章 常量

    5.1  为什么需要常量 1)为了便于用户理解,增加程序的可读性. 2)在程序的很多地方都用到同一个常量,用某一个宏常量来定义可以减少错误. 规则:尽可能的使用含义直观明确的常量来表示程序中多次出现的 ...