Making the Grade POJ - 3666(离散化+dp)

题意:

给你n个山的高度,单独的一个数可以任意加减,让经过对每座山峰任意加减高度后变成递增或递减的序列时,求对每个数的相加或相减的数目的最小和。

题目:

A straight dirt road connects two fields on FJ’s farm, but it changes elevation more than FJ would like. His cows do not mind climbing up or down a single slope, but they are not fond of an alternating succession of hills and valleys. FJ would like to add and remove dirt from the road so that it becomes one monotonic slope (either sloping up or down).

You are given N integers A1, … , AN (1 ≤ N ≤ 2,000) describing the elevation (0 ≤ Ai ≤ 1,000,000,000) at each of N equally-spaced positions along the road, starting at the first field and ending at the other. FJ would like to adjust these elevations to a new sequence B1, . … , BN that is either nonincreasing or nondecreasing. Since it costs the same amount of money to add or remove dirt at any position along the road, the total cost of modifying the road is

|A1 - B1| + |A2 - B2| + … + |AN - BN |
Please compute the minimum cost of grading his road so it becomes a continuous slope. FJ happily informs you that signed 32-bit integers can certainly be used to compute the answer.

Input

  • Line 1: A single integer: N
  • Lines 2…N+1: Line i+1 contains a single integer elevation: Ai

Output

  • Line 1: A single integer that is the minimum cost for FJ to grade his dirt road so it becomes nonincreasing or nondecreasing in elevation.

Sample Input

7
1
3
2
4
5
3
9

Sample Output

3

分析:

前言:这道题纠结了好久,原因是我没想到离散化,知道用离散化后,我还是转不过来,认为经过增加或减少后,山峰的高度不为原始高度的任意一种,所以认为离散化不是最优的,其实到现在我还是这么认为,但由于山峰高度过高,哪怕离散化过后枚举复杂度还是有o(n2n^{2}n2),所以我妥协了(在这里求助,如果有大犇有关于这道题离散化更好地理解,希望能给我一些帮助,嘻嘻)
1.这道题dp还是好理解的,即离散化过后每次枚举当第i个山峰到达某山峰高度,dp[i][j]表示把前i个数变成单调增且第i个数变成原来第j大的数的最小代价。
2、把给定的山峰高度排好序,就成为其离散的递增或递减的高度。
3、对第一点进行与排好序的最小值的点进行比较,求得dp[0][j]要升到第j的高度时所要的花费
4、对第二点及以后的每一点进行更新。dp[i][j]第i+1点到高度j时的前i+1个总的花费
在这里插入图片描述
5、找到更后最后一个点到任意高度的最小值便为答案

AC代码:

#include<string.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=2e3+10;
int n,k;
int a[M],b[M],c[M];
int dp[M][M],e[M][M];///用数组下标进行离散化,表示某位置最小的花费
bool cmp(int x,int y)
{return x>y;
}
int main()
{cin>>n;for (int i=0; i<n; i++)cin>>a[i],b[i]=c[i]=a[i];sort(b,b+n);for (int i=0; i<n; i++)dp[0][i]=abs(b[i]-a[0]);for(int i=1; i<n; i++)//枚举第几座山峰{k=dp[i-1][0];for (int j=0; j<n; j++)///枚举山峰到达离散化后某高度{k=min(k,dp[i-1][j]);dp[i][j]=k+abs(b[j]-a[i]);}}sort(c,c+n,cmp);for (int i=0; i<n; i++)e[0][i]=abs(c[i]-a[0]);for(int i=1; i<n; i++){k=e[i-1][0];for (int j=0; j<n; j++){k=min(k,e[i-1][j]);e[i][j]=k+abs(c[j]-a[i]);}}int ans=dp[n-1][0];for (int i=0; i<n; i++)ans=min(ans,min(dp[n-1][i],e[n-1][i]));cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes的安全性怎么解?从4个方面为你列出方案清单

导语Kubernetes中的安全性是一个多维问题&#xff0c;必须从各个不同的角度来解决才算完善&#xff0c;这篇文章将从4个方面为读者列出安全清单。正文Kubernetes&#xff0c;经过更快的采用和社区的更多贡献&#xff0c;正日益攀登到新的高度。不过&#xff0c;安全性仍然是Kub…

DDIA笔记—第六章 数据分区

第六章 数据分区 数据分区与数据复制 分区通常与复制结合使用&#xff0c;即每个分区在多个节点都存在副本&#xff0c;这就意味着某条记录属于特定的分区&#xff0c;而同样的内容会保存在不同的节点上以提高系统的容错性。 每个节点同时充当某些分区的主副本和其他分区的从…

Magicodes.IE 2.2发布

Magicodes.IE 2.2发布导入导出通用库&#xff0c;支持DTO导入导出以及动态导出&#xff0c;支持Excel、Word、PDF、CSV和HTML。已加入ncc开源组织.Magicodes.IE2.0发布Magicodes.IE2.1发布如何做好一个开源项目(一)GitHub&#xff1a;https://github.com/dotnetcore/Magicodes.…

C++ 基类,子对象,派生类构造函数调用顺序

#include <iostream> using namespace std;class A {public:A( ) {cout << "A Constructor………" << endl;}~A( ) {cout << "A Destructor………" << endl;} };class B: public A {public:B( ) {cout << "B …

C++ 虚析构函数

代码如下: #include <iostream> using namespace std;class Base {public:Base() {cout << "Base" << endl;}~Base() {cout << "Base destructor" << endl;} };class Derived : public Base {public:Derived() {cout <&…

I - Interesting Permutation Gym - 102394I(排列组合)

题意&#xff1a; 纯数题 1≤i≤n, fimax{a1,a2,…,ai}; 1≤i≤n, gimin{a1,a2,…,ai}; 1≤i≤n, hifi−gi. 数列a是一个排列&#xff0c;问多少种排列方式满足h数列。 题目&#xff1a; DreamGrid has an interesting permutation of 1,2,…,n denoted by a1,a2,…,an. He …

Magicodes.SwaggerUI 已支持.NET Core 3.1

Magicodes.SwaggerUI 通过配置文件简单配置即可快速完成SwaggerUI的配置&#xff0c;包括&#xff1a;SwaggerUI的文档信息API分组API隐藏API JSON生成&#xff08;枚举、API架构Id&#xff09;验证自定义页面支持.NET Core 2.2和3.1。版本日志和使用教程见下文。注意&#xff…

[推荐]大量 Blazor 学习资源(二)

继上一篇《[推荐]大量 Blazor 学习资源&#xff08;一&#xff09;》之后&#xff0c;社区反应不错&#xff0c;但因个人原因导致这篇文章姗姗来迟&#xff0c;不过最终还是来了&#xff01;这篇文章主要收集一些常用组件、书籍和电子书。资料来源&#xff1a;https://github.c…

Sql Server之旅——第八站 看公司这些DBA们设计的这些复合索引

这一篇再说下索引的最后一个主题&#xff0c;索引覆盖&#xff0c;当然学习比较好的捷径是看看那些大师们设计的索引&#xff0c;看从中能提取些什么营养的东西&#xff0c;下面我们看看数据库中一个核心的Orders表。一&#xff1a;查看表的架构1. 先查看这个表的大概架构信息-…

C++ setprecision()用法

io 流控制头文件, 主要是一些操纵用法如setw(int n),setprecision(int n) #include < iomanip > setw(n)用法&#xff1a; 通俗地讲就是预设宽度 #include<iostream> #include <iomanip> using namespace std;int main() {cout << setw(5) <<…

备战ccpc分站赛:秦皇岛和威海站(数论模块和dp模块)

挑战程序设计竞赛&#xff08;第2版&#xff09;练习题 tips&#xff1a;难度&#xff08;个人主观判断&#xff09;&#xff1a; 简单* 简单但卡思维 ** 中 *** 中稍加思考 **** 难 ***** 1 . 记录结果再利用的“动态规划” &#xff08;1&#xff09;基础的动态规划算法&am…

15分钟从零开始搭建支持10w+用户的生产环境(四)

上一篇文章&#xff0c;介绍了这个架构中&#xff0c;WebServer的选择&#xff0c;以及整个架构中扩展时的思路。原文地址&#xff1a;15分钟从零开始搭建支持10w用户的生产环境(三)五、架构实践前边用了三篇文章&#xff0c;详细介绍了这个架构的各个部分的选择以及安装。这篇…

[Java基础]体验Stream流

代码如下: package StreamTest;import java.lang.reflect.Array; import java.util.ArrayList;public class StreamDemo {public static void main(String[] args){ArrayList<String> list new ArrayList<String>();list.add("Tom");list.add("ja…

Cow Bowling POJ - 3176(基础的动态规划算法)

题意&#xff1a; 杨辉三角&#xff0c;让从顶部开始走到底部&#xff0c;所经过的每一层的点数相加&#xff0c;使得实现最高和。 题目&#xff1a; The cows don’t use actual bowling balls when they go bowling. They each take a number (in the range 0…99), thoug…

[Java基础]Stream流的常见生成方式

1.Collection体系的集合可以使用默认方法stream()生成流 default Stream< E > stream() 代码如下: package StreamTest;import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Stream;public …

Sumsets POJ - 2229(计数dp)

题意&#xff1a; 给一个数&#xff0c;是集合的总数和&#xff0c;集合元素只能为2的次幂数&#xff0c;问这样的集合有多少&#xff1f; 题目&#xff1a; Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows…

15分钟从零开始搭建支持10w+用户的生产环境(二)

上一篇文章&#xff0c;把这个架构的起因&#xff0c;和操作系统的选择进行了详细说明。原文地址&#xff1a;15分钟从零开始搭建支持10w用户的生产环境(一)二、数据库的选择对于一个10W用户的系统&#xff0c;数据库选择很重要。一般来说&#xff0c;这个用户量&#xff0c;根…

[Java基础]Stream流的常见中间操作方法

代码如下: package StreamTest;import java.util.ArrayList;public class StreamDemo02 {public static void main(String[] args){ArrayList<String> list new ArrayList<String>();list.add("Tom");list.add("Bom");list.add("jack&q…

云原生初探

文章目录什么是云原生&#xff1f;第二讲 容器的基本概念什么是容器&#xff1f;容器运行时的生命周期容器项目的架构容器和VM的差异第三讲 Kubernetes核心概念什么是KubernetesKubernetes架构Kubernetes核心概念和API第四讲 理解Pod和容器设计模式为什么Pod必须是原子调度单位…