此题倒是能用贪心骗点分...

其实对于每一个位置 , 我们知道最后的改善结果一定是原数列中的数 .

(因为要尽量减少消耗, 可以考虑减小至和相邻的相同) 有了这个结论之后, 我们就考虑用dp来做这件事情

首先 存下所有数据于 data[]

排序data 得到 data_sort[]

然后用dp[i][j]来表示 前i个元素 以data_sort[j]为结尾 转换成 递增序列的耗费.

那么我们可以知道

dp[i][j] = min({dp[i-1][k]}) + | data[i]-  data_sort[j] |

所以直译为:

for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
for (int k = 1; k <= j ; ++k)tmp = min(tmp,dp[i-1][k]);
dp[i][j] = tmp + abs(arr[j]-data[i]);

但是可以有大大的优化, 因为第三重循环式为了计算从dp[i][1]到dp[i][j]的最小值, 我们可以利用一个数组来dp计算这个最小值.

所以用ass[i][j]来表示从dp[i][1]到dp[i][j]的最小值,

那么对于ass[i][j] 的更新 可有

ass[i][j] = min(dp[i][j],(j==1 ? INF : (ass[i][j-1])));

当j=1时,ass[i][1] = dp[i][1]

当j>=2时,ass[i][j] = min(dp[i][j],ass[i][j-1]);

所以要先更新dp[i][j]再更新ass[i][j]

因为j的顺序是从1到n, data_sort[j]是从小到大的,所以就维护了整体的单调性 从而得到了答案.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef unsigned long long ull;
const int MaxN = 2000+10;
const int INF = 2147483600;
int n;int data[MaxN];
int data_sort[MaxN];
int data_sort_d[MaxN];
int dp[MaxN][MaxN]; //dp[i][j] 表示前i个数 修补为以data_sort[j]为结尾的序列时的消耗最小体力值
int ass[MaxN][MaxN];//用来辅助求最小值的dp过程bool cmp_int_d(const int& a, const int& b){return a>b;
}void init(){cin>>n;for (int i = 1; i <= n; ++i){cin>>data[i];data_sort[i] = data[i];}sort(data_sort+1,data_sort+n+1);for (int i = 1; i <= n; ++i){data_sort_d[i] = data_sort[n+1-i];}memset(dp,0,sizeof(dp));memset(ass,0,sizeof(ass));
}int build(int* arr){//cout<<"-----\n";for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j){// for (int k = 1; k <= j ; ++k)//     tmp = min(tmp,dp[i-1][k]); dp[i][j] = ass[i-1][j] + abs(arr[j]-data[i]);//cout<<dp[i][j]<<" ";ass[i][j] = min(dp[i][j],(j==1 ? INF : (ass[i][j-1])));//cout<<"("<<ass[i][j]<<") ";
        }//cout<<endl;
    }int ans = INF;for (int i = 1; i <= n; ++i)ans = min(ans,dp[n][i]);return ans;
}int main(int argc, char const *argv[])
{init();int a = build(data_sort);int d = build(data_sort_d);//cout<<a<<" "<<d<<endl;cout<<min(a,d)<<endl;return 0;
}

转载于:https://www.cnblogs.com/yuchenlin/p/sjtu_oj_1282.html

【算法学习笔记】83.排序辅助 动态规划 SJTU OJ 1282 修路相关推荐

  1. 【算法学习笔记】65. 双向扫描 SJTU OJ 1382 畅畅的牙签盒

    http://acm.sjtu.edu.cn/OnlineJudge/problem/1382 注意到 排序之后 i从前向后扫描时,cur恰好是从后向前的,所以即使是双重循环,也是O(n)的算法. # ...

  2. 【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签

    枚举法就好了,推理很麻烦,感觉也做不出来. 创造一个结构体,一个是真实的数,一个是花费的牙签数. 构建一位数,两位数,三位数即可. #include <iostream> #include ...

  3. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  4. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  5. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  6. 【基础】基础算法学习笔记(状态空间)

    基础算法学习笔记(状态空间) 一.状态空间 1.定义(什么是状态空间):一个实际问题的各种可能情况构成的集合.(解释:为什么需要算法来和程序来处理问题?如果一道题可以手算得到答案,换句话说就是存在通过 ...

  7. 数学建模算法学习笔记

    数学建模算法学习笔记 作为建模Man学习数学建模时做的笔记 参考文献: <数学建模姜启源第四版> 网上搜罗来的各种资料,侵删 1.线性预测 levinson durbin算法,自相关什么的 ...

  8. 领扣网算法学习笔记 - 215

    领扣网算法学习笔记 本系列的算法题目来自领扣网 数组类算法第六天 题目:数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 ...

  9. 领扣网算法学习笔记 - 80

    领扣网算法学习笔记 本系列的算法题目来自领扣网 数组类算法第一天 题目: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 示例: 给定 nums ...

最新文章

  1. Solr配置文件分析与验证
  2. 系统SDK介绍-02
  3. 通知 | 2020年度“RONG”奖学金入围答辩名单公布
  4. AngularJS之动态菜单操作指令
  5. java调用net_Java调用C#.net开发的WebService
  6. 【LeetCode从零单排】No27.Remove Element
  7. c调用python第三方库_用 Python ctypes 来调用 C/C++ 编写的第三方库
  8. corefx 源码学习:SqlClient 是如何同步建立 Socket 连接的
  9. python中seaborn画swarm图_Python可视化 | Seaborn5分钟入门(四)——stripplot和swarmplot
  10. 华为3COM交换机PVLAN配置使用说明
  11. PHP7中异常与错误处理与之前版本对比
  12. SQL Server2008如何设置开启远程连接
  13. 【FPGA】:ip核-----CIC滤波器
  14. 基于AVL-CRUISE 2014电动汽车建模与仿真之建模(一)
  15. ArduinoUNO实战-第二章-HelloWorld
  16. 03. JavaMail 发送HTML邮件
  17. Android开发方向,我们如何选择?
  18. 搜搜(www.soso.com),I 老虎油!
  19. Android-系统服务-ClipboardManager
  20. 计算机的中央处理器CPU包括什么,中央处理器cpu由哪些组成 中央处理器的作用是什么...

热门文章

  1. Vue3导入Vue-router报错:Uncaught SyntaxError: The requested module does not provide
  2. 计算机视觉与深度学习 | 基于Matlab提取SIFT特征点(源代码)
  3. 电路 | 抗干扰技术
  4. 树莓派4B设置静态IP
  5. Linux学习一:(Bash 常用命令、vim操作、Linux框架目录)
  6. 基于Visual Studio2010与.NET 4.0--多显示器支持使开发效率事半功倍
  7. void与void*详解
  8. SQLite学习手册(实例代码一)
  9. 适合小白的卷积神经网络图解
  10. 【深度学习】CNN图像分类:从LeNet5到EfficientNet