POJ 36666 Making the Grade 简单DP
题意是:
给出n个数,让你用最小的花费将其改成非递增或非递减的
然后花费就是新序列与原序列各个位置的数的差的绝对值的和
然后可以看到有2000个数,数的范围是10亿
仔细观察可以想象到。其实改变序列中的值时,也只需要改成一个出现在原序列中的值即可
也就是说新序列中的数都是在原数列中出现过的。
那么我们可以将原数列离散化。
dp[i][j] 表示将i位置的数改成离散化后第j个数时 前i个数改造成非递减序列时的最小花费
dp[i][j] = min(dp[i - 1][k]) + abs(a[i] - b[j]) 其中k <= j a[i]是原数列中的第i个数,b[j]是离散化排序过的第j个数
然后我们发现min(dp[i - 1][k]) 这个可以用一个数组记录下来
用mi[i][j] 表示到第i个数时改成离散化第j个数时 所有dp[i][k] (k<=j) 的最小值
mx[i][j] = min(mx[i][j - 1], dp[i][j])
然后
题目还说是可以非递增
那么直接把数列倒过来,不就还是求非递减了么
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <vector>
#define MAXN 2222
#define INF 1000000007
using namespace std;
int n, m, ans;
int a[MAXN], b[MAXN], dp[MAXN][MAXN], mi[MAXN][MAXN];
void gao(int a[])
{
memset(dp, 0, sizeof(dp));
memset(mi, 0x3f, sizeof(mi));
for(int i = 0; i < m; i++) mi[0][i] = 0;
for(int i = 1; i < n; i++)
for(int j = 0; j < m; j++)
{
dp[i][j] = mi[i - 1][j] + abs(a[i] - b[j]);
if(j > 0) mi[i][j] = mi[i][j - 1];
mi[i][j] = min(mi[i][j], dp[i][j]);
}
int res = INF;
for(int i = 0; i < m; i++) res = min(res, dp[n - 1][i]);
ans = min(ans, res);
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b, b + n);
m = unique(b, b + n) - b;
ans = INF;
gao(a);
reverse(a, a + n);
gao(a);
printf("%d\n", ans);
return 0;
}
POJ 36666 Making the Grade 简单DP的更多相关文章
- Poj 3666 Making the Grade (排序+dp)
题目链接: Poj 3666 Making the Grade 题目描述: 给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价? 解题思路: 对于修好的路径的每 ...
- POJ - 3666 Making the Grade(dp+离散化)
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- POJ 3267 The Cow Lexicon 简单DP
题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...
- poj 1050 To the Max (简单dp)
题目链接:http://poj.org/problem?id=1050 #include<cstdio> #include<cstring> #include<iostr ...
- poj 3666 Making the Grade(离散化+dp)
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- poj 3666 Making the Grade(dp离散化)
Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7068 Accepted: 3265 ...
- poj 1417(并查集+简单dp)
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2087 Accepted: 640 Descrip ...
- POJ 3666 Making the Grade (DP)
题意:输入N, 然后输入N个数,求最小的改动这些数使之成非严格递增即可,要是非严格递减,反过来再求一下就可以了. 析:并不会做,知道是DP,但就是不会,菜....d[i][j]表示前 i 个数中,最大 ...
- POJ 3666 Making the Grade (DP滚动数组)
题意:农夫约翰想修一条尽量平缓的路,路的每一段海拔是A[i],修理后是B[i],花费|A[i] – B[i]|,求最小花费.(数据有问题,代码只是单调递增的情况) #include <stdio ...
随机推荐
- Python IDLE 快捷键
Python IDLE 快捷键 编辑状态时: Ctrl + [ .Ctrl + ] 缩进代码 Alt+3 Alt+4 注释.取消注释代码行 Alt+5 Alt+6 切换缩进方式 空格<=> ...
- Swift - 使用arc4random()、arc4random_uniform()取得随机数
arc4random()这个全局函数会生成9位数的随机整数 1,下面是使用arc4random函数求一个1~100的随机数(包括1和100) 1 var temp:Int = Int(arc4ra ...
- android百度地图打包混淆 用不了No such file or directory (2) com.baidu.mapapi.BMapManager.init(Unknown Source)
调用了百度地图地图开发包是baidumapapi_v2_1_1.jar,定位SDK版本是locSDK_3.3.jar 调试的时候能运行!可是打包签名后就运行不了! baidu google 了好久! ...
- Delphi 数据类型列表 good
Delphi 数据类型列表 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 2147483647 4 有符号32位 Cardinal 0 .. 429496 ...
- 与众不同 windows phone (22) - Device(设备)之摄像头(硬件快门, 自动对焦, 实时修改捕获视频)
原文:与众不同 windows phone (22) - Device(设备)之摄像头(硬件快门, 自动对焦, 实时修改捕获视频) [索引页][源码下载] 与众不同 windows phone (22 ...
- Android Studio IDE Out of Memory
场景: 尝试过各种方式,IDE重装,重新启动,设置IDE MEMORY大小JDK MEMORY大小都无效 终于在FILE->INVALIDATE CACHES/RESTART 中点击重新启动之后 ...
- 如何制作python安装模块(setup.py)
Python模块的安装方法: 1. 单文件模块:直接把文件拷贝到$python_dir/lib 2. 多文件模块,带setup.py:python setup.py install 3. egg文件, ...
- 3.1.2 MVC模式和URL访问
本节课大纲: 一.什么是MVC //了解 M -Model 编写model类 对数据进行操作 使用Model类 来操作数据 V -View 编写html文件,页面呈现 C -Controller 编写 ...
- android一个上传图片的样例,包含怎样终止上传过程,假设在上传的时候更新进度条(一)
先上效果图: Layout为: <? xml version="1.0" encoding="utf-8"?> <LinearLayout x ...
- 优酷m3u8视频源地址获取失败
昨天和今天上午,优酷站点视频全然没有办法播放,可是我是获取的优酷视频的视频原地址,所以app还是能够正常播放而且有下载功能.今天下午開始,优酷视频网页能够訪问了,可是视频原地址却不在了.我全部的app ...