博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1169\uvalive 3983 Robotruck 单调队列优化DP
阅读量:6090 次
发布时间:2019-06-20

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

题意:有n个垃圾,坐标为(xi,yi)重量为wi。有一个机器人,要按照编号从小到大的顺序捡起所有垃圾并扔进垃圾桶(坐标(0,0))。机器人可以捡起几个垃圾以后一起扔掉,但任何时候其手中的垃圾总重量不能超过C.两点间的行走距离为曼哈顿距离。求出机器人行走的最短距离。

设dp[i]为机器人清理完前i个垃圾所走的最短路程,则,

dp[i]=min{dp[j]+dist(0,j+1)+dist(j+1,j+2)+dist(j+2,j+3)...+dist(i-1,i) + dist(i,0) | j<i,sumw[j+1...i]<=C};0为原点

用totald[i]表示dist(O,1)+dist(1,2)+..+dist(i-1,i)

则dist(j+1,j+2)+...+dist(i-1,i)=totald[i]-totald[j+1];

dp[i]=min{dp[j]+dist(0,j+1)-totald[j+1] | j<i,sumw[j+1...i]<=C }+totald[i]+dist(0,i);

可用单调队列优化

const int maxn=100100;int dp[maxn],totald[maxn],totalw[maxn];int x[maxn],y[maxn],w[maxn];int dist(int a,int b){    return abs(x[a]-x[b])+abs(y[a]-y[b]);}int f(int id){    return dp[id]+dist(0,id+1)-totald[id+1];}int q[maxn];int work(int n,int c){    int front=1,rear=2;    dp[0]=0;    q[1]=0;    for(int i=1;i<=n;i++)    {        while(rear>front&&totalw[i]-totalw[q[front]]>c)front++;        dp[i]=f(q[front])+dist(i,0)+totald[i];        while(rear>front&&f(i)
View Code

 

 

转载于:https://www.cnblogs.com/BMan/p/3249970.html

你可能感兴趣的文章
在方法内部获取调用自己方法的“名称”
查看>>
调试json
查看>>
C - Surprising Strings
查看>>
hibernate里的generator中class =value介绍
查看>>
activity-alias的使用
查看>>
免费的天气预报API--谷歌,雅虎,中央气象台
查看>>
第36周日
查看>>
c# 播放器 支持所有格式
查看>>
SQL Server 无法打开物理文件的 2 种解决办法
查看>>
对MBProgressHUD进行二次封装并精简使用
查看>>
Java抓取网页数据(原网页+Javascript返回数据)
查看>>
推荐一款好用的文件/文件夹对比工具 —— Beyond Compare
查看>>
Chapter 1 Securing Your Server and Network(6):为SQL Server訪问配置防火墙
查看>>
关于 NSInvocation
查看>>
android 播放视频
查看>>
IOS成长之路-Nsstring中搜索方法rangeOfString
查看>>
安卓高手之路之java层Binder
查看>>
java设计模式--结构型模式--桥接模式
查看>>
JS window.open()属性
查看>>
Oracle 字符集的查看和修改
查看>>