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

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

题意:

某条路n段,每段高度hi,现在要将路修成不上升或不下降序列,问最小费用,把高度a修成b费用为|a-b|。n≤2000。

题解:

有个结论,每段路修成的高度必定是原序列中已经出现过的高度(因为修好的路是非严格单调)。所以直接离散化,然后dp(修成不下降):f[i][j]=min(f[i-1][k]+abs(a[j]-a[k])),a[j]>=a[k]。但是这样会T,而a数组因为之前的离散化是单调的,所以可以用前缀最小值数组维护一下f[i-1][1]到f[i-1][n]的最小值,然后就可以递推了。

代码:

1 #include 
2 #include
3 #include
4 #include
5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 2010 7 #define ll long long 8 #define INF 10000000000000000 9 using namespace std;10 11 inline int read(){12 char ch=getchar(); int f=1,x=0;13 while(ch<'0'||ch>'9'){
if(ch=='-')f=-1; ch=getchar();}14 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();15 return f*x;16 }17 int n,tot,a[maxn],v[maxn]; ll f[maxn],ans,mn[maxn];18 struct nd{
int v,id;}nds[maxn]; bool cmp(nd a,nd b){
return a.v
=1;j--)mn[j]=min(mn[j+1],f[j]+abs(v[j]-v[a[i]])); inc(j,1,tot)f[j]=mn[j];26 }27 inc(i,1,tot)ans=min(ans,f[i]); memset(f,0,sizeof(f));28 inc(i,1,n){29 mn[1]=f[1]+abs(v[1]-v[a[i]]);30 inc(j,2,tot)mn[j]=min(mn[j-1],f[j]+abs(v[j]-v[a[i]])); inc(j,1,tot)f[j]=mn[j];31 }32 inc(i,1,tot)ans=min(ans,f[i]); printf("%lld",ans); return 0;33 }

 

20160921

转载于:https://www.cnblogs.com/YuanZiming/p/5901659.html

你可能感兴趣的文章
EBS 12.1.3 db 11.2.3 dg AND DG SWITCH OVER
查看>>
Oracle中的JOIN
查看>>
html中iframe控制父页面刷新
查看>>
每天一个linux命令(50):crontab命令
查看>>
linux命令7--cat命令&nl命令
查看>>
.NET底层开发技术
查看>>
RHEL regiester
查看>>
c/c++中的一些基础知识
查看>>
练习:输出整数每一位,计算算数,9出现次数,输出图案,水仙花数
查看>>
操作系统的发展
查看>>
HEVC码流简单分析
查看>>
搭建蚂蚁笔记(服务器)
查看>>
lnmp
查看>>
二分查找
查看>>
Cloud Test 在手,宕机时让您不再措手不及
查看>>
Centos7.2安装Vmware Tools
查看>>
深入理解Java内存模型(一)——基础
查看>>
美图秀秀下载|美图秀秀电脑版下
查看>>
生产者消费者模式
查看>>
tomcat的Context配置,虚拟访问数据
查看>>