这个题目我最初的做法沿用树形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. uniapp属性插值报错Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead.

    解决方法: 因为vue 2.x不支持对属性使用插值{{}}的方式赋值,所以要使用v-bind指令(或简写“:”)来指定属性. v-bind指令 v-bind:id="item.id" ...

  2. 吴裕雄--天生自然java开发常用类库学习笔记:集合工具类Collections

    import java.util.Collections ; import java.util.List ; import java.util.Set ; public class Collectio ...

  3. 史上最全的mysql聚合函数总结(与分组一起使用)

    1.首先我们需要了解下什么是聚合函数 聚合函数aggregation function又称为组函数. 认情况下 聚合函数会对当前所在表当做一个组进行统计. 2.聚合函数的特点 1.每个组函数接收一个参 ...

  4. Docker-harbor-V1.3.0 ”私有仓库“搭建 Easy

    准备: centos     7.0 Docker version 1.12.6    docker-compose version 1.19.0   1: updata-yum:   更新yum 源 ...

  5. Web基础之Spring MVC

    Spring MVC Spring MVC 说是框架,对Tomcat来说其实就是一个Servlet,关于如何从上古时期的Servlet演化到如今的SpringMVC的,可以看看这篇博文:Spring ...

  6. Live555 的一个缺陷–例子不能支持多线程(已经修改成支持多线程)

    我对Live555进行了一次封装,但是Live555 是单线程的,里面定义的全局变量太多,我封装好dll库后,在客户端调用,因为多个对话框中要使用码流,我就定义了多个对象从设备端接收码流,建立多个连接 ...

  7. centos6.7开启linux虚拟机内部错误

    如图 这个需要用管理员身份运行就好了 右键----->以管理员身份打开,正常启动

  8. 3-Java逻辑控制语句

    目录 Java选择结构 Java循环结构 return.break.continue Math.random()的使用和条件运算符 1.Java选择结构 1.1.if(布尔表达式)单选结构 - 当布尔 ...

  9. Spring Boot Hello World (restful接口)例子

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  10. ACM-Work Assignment

    题目描述:Work Assignment   设有n件工作分配给n个人.将工作i 分配给第j 个人所需的费用为Cij.试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小. 设计一个算 ...