CH 5102Mobile Service题解
题目;
用动态规划很容易将完成任务量作为dp的阶段,通过指派服务员,从当前i-1个任务转移到i个任务;
我们可以用一个四维数组f[i][x][y][z]来表示在完成当前任务i时,三个机器人分别在x,y,z的位置;每次由其中一个机器人向目标位置转移;取min值;
但是算法规模一点都不乐观;
我们想到在完成当前任务i时,必定存在一个机器人位于p[i],即目标地;那么我们可以用f[i][x][y],即完成任务i时,另外两个机器人位于x,y的位置;
状态转移:
f[k][i][j]=min(f[k][i][j],f[k-1][i][j]+c[p[k-1]][p[k]]);//k为当前完成任务,c数组记录两者间的距离,p数组为目标到达地;
	     	f[k][p[k-1]][j]=min(f[k][p[k-1]][j],f[k-1][i][j]+c[i][p[k]]);
	     	f[k][i][p[k-1]]=min(f[k][i][p[k-1]],f[k-1][i][j]+c[j][p[k]]);
不妨设p0=3,那么初始值f[0][1][2]=0;目标为f[N][?][?];
题后反思:
求解线性dp要注意阶段的选择,注意附加信息要处理;
确定状态时要注意选择最小的能表示整个状态的维度空间;
阶段保证无后效性;
#include<bits/stdc++.h>
#define maxl 201
#define maxn 1001
using namespace std;
int f[][][],n,m,t,l,c[][],p[],ans;
template<typename T>inline void read(T &x)
{
x=;T f=,ch=getchar();
while(!isdigit(ch)) ch=getchar();
if(ch=='-') f=-, ch=getchar();
while(isdigit(ch)) x=(x<<)+(x<<)+(ch^), ch=getchar();
x*=f;
}
int main()
{
read(t);
while(t--) {
int ans=;
read(l);read(n);
for(int i=;i<=l;i++)
for(int j=;j<=l;j++)
read(c[i][j]);
memset(f,0x7f,sizeof(f));
for(int i=;i<=n;i++) {
read(p[i]);
}
f[][][]=c[][p[]];
f[][][]=c[][p[]];
f[][][]=c[][p[]];
p[]=,f[][][]=;
for(int k=;k<=n;k++)
for(int i=;i<=l;i++)
for(int j=;j<=l;j++)
if(i!=j&&p[k-]!=j&&p[k-]!=i)
{
f[k][i][j]=min(f[k][i][j],f[k-][i][j]+c[p[k-]][p[k]]);
f[k][p[k-]][j]=min(f[k][p[k-]][j],f[k-][i][j]+c[i][p[k]]);
f[k][i][p[k-]]=min(f[k][i][p[k-]],f[k-][i][j]+c[j][p[k]]);
}
for(int i=;i<=l;i++)
for(int j=;j<=l;j++) {
if(i!=j&&i!=p[n]&&j!=p[n])
ans=min(ans,f[n][i][j]);
}
printf("%d\n",ans);
}
return ;
}
CH 5102Mobile Service题解的更多相关文章
- SPOJ 703 SERVICE - Mobile Service 题解
		
题面 好题啊!~ 设f[i][j][k][l]表示已经处理完前i个请求后,a在j,b在k,c在l的最小值是多少: 那么f[i][p[i]][k][l]=min(f[i][p[i]][k][l],f[i ...
 - 基于注释的Spring Security实战
		
一.准备工作 预准备的工具及软件有: 1. Eclipse IDE:我使用Eclipse JEE 3.7版,即eclipse-jee-indigo-SR2-win32-x86_64.zip 2. JD ...
 - linux系统编程:自己动手写一个who命令
		
who命令的作用用于显示当前有哪些用户登录到系统. 这个命令执行的原理是读取了系统上utmp文件中记录的所有登录信息,直接显示出来的 utmp文件在哪里呢? man who的时候,在手册下面有这么一段 ...
 - duboo 配置文件
		
官方文档 http://dubbo.apache.org/en-us/docs/user/quick-start.html 自己的 <?xml version="1.0" e ...
 - Eureka 整理
		
服务治理:(该模块也可以使用集群) 该模块主要负责完成微服务架构中的服务治理功能. 1.构建服务注册中心. 每个服务单元需要向注册中心登记自己提供的服务. 2.服务注册与服务发现. 服务之间的调用不再 ...
 - 【LeetCode 】验证回文串
		
[问题]给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写.说明:本题中,我们将空字符串定义为有效的回文串. 示例 : 输入: "A man, a plan, a ...
 - java基础学习总结——GUI编程(一) 还未仔细阅读
		
一.AWT介绍
 - CH 5102 Mobile Service(线性DP)
		
CH 5102 Mobile Service \(solution:\) 这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求.所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有 ...
 - CH 6201 走廊泼水节题解
		
题目链接:CH6201 当时在海亮考试的第一题: 心得:其实一个算法是要真正理解这个思路和过程,而并不是单单知道它是用来写什么题的: 思路:n个节点有n-1条边,把这n-1条边按照权值从小到大排序,有 ...
 
随机推荐
- Linux 下如何修改用户名(同时修改用户组名和家目录)
			
有时候,由于某些原因,我们可能会需要重命名用户名.我们可以很容易地修改用户名以及对应的家目录和 UID.-- Shusain 本文导航◈ 修改用户名12%◈ 修改家目录43%◈ 更改用户 UID52% ...
 - HTML个人简介
			
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...
 - 个人对stm32ADC编程关键点的理解
			
平时在做项目或者参加比赛的过程中,个人觉得,有些东西写出来可能会帮助到新手少走弯路.(也很可能是错误的,欢迎大家纠错) 如果只是采集一路信号,直接用ADC独立模式,单通道就可以了. 如果需要同时采集多 ...
 - UML作业第三次:分析《书店图书销售管理系统,绘制类图
			
plantuml类图绘制方法的学习: 1.关于类图的学习: 类图显示了系统的静态结构. 类:类图中的主要元素,用矩形表示.矩形的上层表示类名.中层表示属性.下层表示方法. 类之间的关系:关联.依赖.聚 ...
 - FB面经Prepare: Friends Recommendation
			
有个getFriend() API, 让你推荐你的朋友的朋友做你的朋友,当然这个新朋友不能是你原来的老朋友 package fb; import java.util.*; public class R ...
 - G面经: Design Stock Price Display System
			
Implement a simple stock price display systemwhich will show High, Low and Last price for a given st ...
 - PHP----------php的opcache扩展配置参数介绍
			
[opcache]zend_extension = "路径/ext/php_opcache.dll" ; Zend Optimizer + 的开关, 关闭时代码不再优化.opcac ...
 - Linux批量结束、杀死进程
			
ps aux|grep python|grep -v grep|cut -c 9-15|xargs kill -15 管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入.下面 ...
 - 记一个神奇的Bug
			
多年以后,当Abraham凝视着一行行新时代的代码在屏幕上川流不息的时候,他会想起2019年4月17日那个不平凡夜晚,以及在那个夜晚他发现的那个不可思议的Bug. 虽然像无数个普普通通的夜晚一样,我在 ...
 - CentOS7.3安装zimbra8.7.11
			
系统版本:CentOS7.3 Zimbra版本:8.7.11 设置IP地址 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #使用vi命令修改ip BOOT ...