博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1592: [Usaco2008 Feb]Making the Grade 路面修整
阅读量:6205 次
发布时间:2019-06-21

本文共 1129 字,大约阅读时间需要 3 分钟。

【算法】动态规划DP

【题解】

题目要求不严格递增或不严格递减。

首先修改后的数字一定是原来出现过的数字,这样就可以离散化。

f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数组,b表示原数组。

f[i][j]=min(f[i-1][k])+abs(b[i]-a[j])

min部分优化,复杂度O(n^2)。

#include
#include
#include
using namespace std;const int maxn=2010,inf=0x3f3f3f3f;int f[maxn][maxn],n,a[maxn],num,b[maxn];bool cmp(int a,int b){
return a>b;}int abs(int x){
return x>0?x:-x;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i]; sort(a+1,a+n+1); f[0][0]=0; for(int i=1;i<=n;i++){ num=inf; for(int j=1;j<=n;j++){ num=min(num,f[i-1][j]); f[i][j]=num+abs(b[i]-a[j]); } } int ans=inf; for(int i=1;i<=n;i++)ans=min(ans,f[n][i]); memset(f,0,sizeof(f)); sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++){ num=inf; for(int j=1;j<=n;j++){ num=min(num,f[i-1][j]); f[i][j]=num+abs(b[i]-a[j]); } } for(int i=1;i<=n;i++)ans=min(ans,f[n][i]); printf("%d",ans); return 0;}
View Code

和差不多。

 

转载于:https://www.cnblogs.com/onioncyc/p/7456579.html

你可能感兴趣的文章
RHEL 5基础篇—常见系统启动类故障
查看>>
对‘初学者应该选择哪种编程语言’的回答——计算机达人成长之路(38)
查看>>
Redis-3.2主从复制与集群搭建 推荐
查看>>
随便说说:在ASP.NET应用程序中上传文件
查看>>
【jQuery Demo】图片由下至上逐渐显示
查看>>
在.NET中使用SMTP发送邮件
查看>>
Unity Camera的两种模式
查看>>
3.5. Ticket
查看>>
越狱第一至五季/全集迅雷下载
查看>>
从Mysql slave system lock延迟说开去
查看>>
归并排序
查看>>
RecyclerView的下拉刷新和加载更多 动画
查看>>
ABAP常见面试问题
查看>>
程序猿是如何解决SQLServer占CPU100%的
查看>>
web.xml
查看>>
HBase-1.2.4LruBlockCache实现分析(一)
查看>>
SDN交换机在云计算网络中的应用场景
查看>>
革新以太网交换机架构 全光网络的风刮进园区
查看>>
物联网商机迸发 LPWAN芯片现身 本文转自d1net(转载)
查看>>
【eclipse转idea的第一天】配置idea
查看>>