UVALive 3983 捡垃圾的机器人 DP
这个题目我最初的做法沿用树形DP的做法,设置一个 dp[i][0]表示机器人在i点不回去的最短路径,dp[i][1]表示机器人在i点回去的最短路径,规划方向为i-1向i转移,结果发现这个不能用树形的结构去描述,当前状态不能仅仅靠前一个状态就决定好了,对于后面的点来说,可能当前点走另外一条路会好一些
故,最后还是使用了书上的结构,其实也很简单,用d[i],表示收完从1-i所有的垃圾并送回原点的垃圾桶的最优距离,显然,最终结果就是d[n];
则,如果某个j点满足 w(j+1,i)<=C,则d[i]=min(d[i],d[j]+dist(j+1,i)+origin(j+1)+origin(i));
origin(i)表示原点到i点的距离,dist(i,j)表示从i点到j点的距离,w表示从某点到另一点一起的总重量。
当然,如果直接从1开始枚举到i来确定j会超时,大白书上用维护一个队列来优化,我没怎么看懂
用的土方法,由于w(j+1)<=C,才能进行状态转移,不妨直接设置一个变量cur保存左边界,每次从cur开始枚举,而且每次都把cur边界往右移(如果当前不满足w<=c的条件,则右移,显然,右移不仅不会影响后续决策,还能缩短时间,因为当前不满足w的条件,后续就更加不会满足)就能避免大量运算。
至于计算距离,还是用老方法,前缀和,来瞬间得到某两点的距离差。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int d[];
int total_d[],total_w[],origins[];
int x[],y[];
int n,M;
int func(int x)
{
return d[x]-total_d[x+]+origins[x+];
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&M,&n);
int w;
total_d[]=total_w[]=;
x[]=y[]=;
for (int i=;i<=n;i++)
{
scanf("%d%d%d",&x[i],&y[i],&w);
total_d[i]=total_d[i-]+abs(x[i]-x[i-])+abs(y[i]-y[i-]);
total_w[i]=total_w[i-]+w;
origins[i]=x[i]+y[i];
d[i]=total_d[i]+origins[i];
}
int cur=;
for (int i=;i<=n;i++)
{
while (cur<i && total_w[i]-total_w[cur]>M) cur++;
int temp=<<;
for (int j=cur;j<i;j++)
{
temp=min(temp,func(j));
}
if (temp<(<<))
d[i]+=temp;
}
printf("%d\n",d[n]);
if (t>) printf("\n");
}
return ;
}
UVALive 3983 捡垃圾的机器人 DP的更多相关文章
- LA3983 捡垃圾的机器人
Problem C - Robotruck Background This problem is about a robotic truck that distributes mail package ...
- 单调队列优化dp(捡垃圾的机器人)
/************************************************************************* > File Name: a.cpp > ...
- 【暑假】[深入动态规划]UVAlive 3983 Robotruck
UVAlive 3983 Robotruck 题目: Robotruck Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format ...
- PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)
说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...
- UVaLive 3983 Robotruck (DP + 单调队列)
题意:有n个垃圾,第i个垃圾坐标为(xi,yi),重量为wi,有一个机器人,要按照编号从小到大的顺序剑气所有的垃圾兵扔进垃圾桶,垃圾桶在原点, 每次总重量不能超过C,两点间距离为曼哈顿距离,求出最短的 ...
- UVALive 3983 Robotruck (单调队列,dp)
如果状态定义为序号和重量的话,决策就是下一个垃圾捡或者不减,但是状态数太多了. 如果只定义序号作为状态的话,决策就变成从前面的某个j一直捡到i才送回垃圾. 这就变成了一个区间选最小值的问题,用单调队列 ...
- 洛谷P1156 垃圾陷阱[背包DP]
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...
- UVALive - 3942 Remember the Word[Trie DP]
UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...
- 【洛谷】P1156 垃圾陷阱【DP】
P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2≤D≤100)英尺. 卡门想把垃圾堆起来 ...
随机推荐
- 039、Java中逻辑运算之普通与运算“&”
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 《新标准C++程序设计》4.7-4.9(C++学习笔记17)
一.重载类型强制转换运算符 在C++中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符.类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数.经过 ...
- Django(六)实战2:向数据库添加,删除数据、重定向写法、重定向简写
一.向数据库添加图书数据 [上接]https://blog.csdn.net/u010132177/article/details/103831173 1)首先开启mysql服务,并运行项目 启动my ...
- NO12 useradd-passwd-uname-hostname命令-上传rz下载sz-批量部署- Linux用户相关操作
24 useradd #添加用户 语法:useradd 用户名 例子:ueradd oldboy .25 passwd #为用户设置或修改 ...
- Day 29:HTML常用标签
软件的结构: cs结构的软件的缺点:更新的时候需要用户下载更新包然后再安装,需要开发客户端与服务端. cs结构软件的优点: 减轻服务端的压力,而且可以大量保存数据在客户端. C/S(Client ...
- 法国:5G网络不会排除任何设备厂商
腾讯科技讯,据国外媒体报道,法国财政部长布鲁诺·勒梅尔(Bruno Le Maire)日前表示,法国有关 5G 电信网络的决定将基于网络的安全和性能,他强调说,法国政府不会将某一个特定的厂商排除在法国 ...
- netty权威指南学习笔记一——NIO入门(4)AIO
NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供以下两种方式获取操作结果. 1.通过java.util.concurrent.Future 类来表示异步操 ...
- .Net 经典案例
1.捕捉一只小可爱 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- Maven项目工程目录
maven工程目录规范: src/main/java 存放项目的.java文件 src/main/resources 存放项目的资源文件,如spring.hibernate配置文件 src/t ...
- tomcat-jvm内存问题
http://www.360doc.com/content/14/0617/12/114824_387440563.shtml http://27091497.blog.163.com/blog/st ...