这个题目我最初的做法沿用树形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的更多相关文章

  1. LA3983 捡垃圾的机器人

    Problem C - Robotruck Background This problem is about a robotic truck that distributes mail package ...

  2. 单调队列优化dp(捡垃圾的机器人)

    /************************************************************************* > File Name: a.cpp > ...

  3. 【暑假】[深入动态规划]UVAlive 3983 Robotruck

     UVAlive 3983 Robotruck 题目: Robotruck   Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format ...

  4. PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)

    说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...

  5. UVaLive 3983 Robotruck (DP + 单调队列)

    题意:有n个垃圾,第i个垃圾坐标为(xi,yi),重量为wi,有一个机器人,要按照编号从小到大的顺序剑气所有的垃圾兵扔进垃圾桶,垃圾桶在原点, 每次总重量不能超过C,两点间距离为曼哈顿距离,求出最短的 ...

  6. UVALive 3983 Robotruck (单调队列,dp)

    如果状态定义为序号和重量的话,决策就是下一个垃圾捡或者不减,但是状态数太多了. 如果只定义序号作为状态的话,决策就变成从前面的某个j一直捡到i才送回垃圾. 这就变成了一个区间选最小值的问题,用单调队列 ...

  7. 洛谷P1156 垃圾陷阱[背包DP]

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...

  8. UVALive - 3942 Remember the Word[Trie DP]

    UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...

  9. 【洛谷】P1156 垃圾陷阱【DP】

    P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2≤D≤100)英尺. 卡门想把垃圾堆起来 ...

随机推荐

  1. JSON数组序列化C#方法

    /// <summary> /// dataTable转换成Json格式 JSON对应关系 三层数组 /// </summary> /// <param name=&qu ...

  2. 解决物理机U盘安装Kali Linux2018.1,光驱无法加载问题

    1.无效的方法: (1)执行 df -m,然后查看U盘设备是否挂载到了/media,导致cd-rom不能被挂载,执行 umount  /media. (2)在光驱加载安装界面,把U盘拔下换到电脑的另外 ...

  3. 【LeetCode】101. 对称二叉树

    题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3, ...

  4. Rails 第一课:环境配置 Ruby Rails RVM Heroku

    安装 上传专案到 Heroku 安装 Ruby 2.3.1 Rails 5.0.0.1 RVM 1.27.0 比较幸运一个问题都未碰到 MacOS 10.12.1 配置完成系统顺利升级到10.12.2 ...

  5. 可并堆模板题-mergeable heap

    Description 有n个点,第i个点标号为i,有两种操作:0 x y 表示把x所在堆和y所在堆合并.1 x 表示询问x所在堆的最小权. Input 第一行两个整数n,m,表示有n个点m个操作. ...

  6. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) E. Arson In Berland Forest

    E. Arson In Berland Forest The Berland Forest can be represented as an infinite cell plane. Every ce ...

  7. linux命令之strace简单使用

    strace是什么 strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进程状态变更等. 使用方式 strace 使用帮 ...

  8. CentOS 7 下oracle 11G R2 ADG 搭建

    本文记录ADG搭建操作步骤,首先在虚拟机CentOS中安装并配置好oracle 11g R2(具体安装步骤在我的另一篇博客中),然后拷贝一份虚拟机,修改新虚拟机的主机名和ip配置,这时候主库和备库是一 ...

  9. P1036 跟奥巴马一起编程

    转跳点:

  10. 18 ~ express ~ 前台分类导航展示 与 排序

    一,前台分类导航展示 1,后台文件:  /router/main.js router.get('/',(req,res,next)=>{ /** * 从数据库中读取分类信息 * rs是一个数组类 ...