题目限制
时间限制 内存限制 评测方式 题目来源
1000ms 131072KiB 标准比较器 Local
题目描述
一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q)。这个函数没有必要对称,但是c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费。 输入格式
第一行有两个整数L,N(3<=L<=200, 1<=N<=1000)。L是位置数;N是请求数。每个位置从1到L编号。下L行每行包含L个非负整数。第i+1行的第j个数表示c(i,j) ,并且它小于2000。最后一行包含N个数,是请求列表。一开始三个服务员分别在位置1,2,3。 输出格式
一个数M,表示最小服务花费。 样例数据
输入样例 #1 输出样例 #1
5 9
0 1 1 1 1
1 0 2 3 2
1 1 0 4 1
2 1 5 0 1
4 2 3 4 0
4 2 4 1 5 4 3 2 1
5

最朴素的设计是 f[i][x][y][z] 处理第i个请求时,三个人分别在x,y,z处,然后比较x,y,z到新请求地点的费用即可。

然后发现空间不够。。那就考虑优化它。

第一个是滚动数组,i行只依赖i-1行,这个很好想。

第二个是砍掉一维,因为在处理第i个请求时,上一个请求(i-1个)一定已经处理好了,所以三个人一定有一个站在ask[i-1]处,三维里有一维是冗余信息,所以

f[i][x][y] 表示处理第i个请求的时候,两个人站在x,y处(另一个在ask[i-1]处) 时的最小花费

边界的处理,令ask[0]=3,f[0][1][2] 就是三个人站在1,2,3处的初态。

//Stay foolish,stay hungry,stay young,stay simple
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std; const int INF=1<<30; inline int read_d(){
int ret=0;char c;
while(c=getchar(),!isdigit(c));
while(isdigit(c)) ret=ret*10+c-'0',c=getchar();
return ret;
} int n,m;
int ask[1002];
int cost[202][202];
int f[2][202][202]; int main(){
memset(f,0x3f,sizeof(f));
n=read_d();m=read_d();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cost[i][j]=read_d();
for(int i=1;i<=m;i++)
ask[i]=read_d();
ask[0]=3;f[0][1][2]=0;
int l=0,p=1;
for(int i=1;i<=m;i++){
memset(f[p],0x3f,sizeof(f[p]));
l^=1;p^=1;
int u=ask[i-1],v=ask[i];
for(int j=1;j<=n+1;j++){
for(int k=1;k<=n;k++){
f[l][j][k]=
min(f[l][j][k],f[p][j][k]+cost[ask[i-1]][v]);
f[l][u][k]=
min(f[l][u][k],f[p][j][k]+cost[j][v]);
f[l][j][u]=
min(f[l][j][u],f[p][j][k]+cost[k][v]);
}
} }
int ans=INF;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans=min(ans,f[m&1][i][j]);
cout<<ans<<endl;
return 0;
}

[JOYOI] 1061 Mobile Service的更多相关文章

  1. tyvj 1061 Mobile Service

    线性DP 本题的阶段很明显,就是完成了几个请求,但是信息不足以转移,我们还需要存储三个服务员的位置,但是三个人都存的话会T,我们发现在阶段 i 处,一定有一个服务员在 p[i] 处,所以我们可以只存另 ...

  2. [tyvj 1061] Mobile Service (线性dp 滚动数组)

    3月15日第一题! 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须 ...

  3. Unable to create Azure Mobile Service: Error 500

    I had to go into my existing azure sql database server and under the configuration tab select " ...

  4. 如何使用新浪微博账户进行应用登录验证(基于Windows Azure Mobile Service 集成登录验证)

    使用三方账号登录应用应该对大家来说已经不是什么新鲜事儿了,但是今天为什么还要在这里跟大家聊这个话题呢,原因很简单 Windows Azure Mobiles Service Authenticatio ...

  5. vs2015-Azure Mobile Service

    /App_Data /App_Start/ WebApiConfig.cs using System; using System.Collections.Generic; using System.C ...

  6. windows phone开发-windows azure mobile service使用入门

    在使用azure之前,我一直只能做本地app,或者使用第三方提供的api,尽管大多数情况下够用,但是仍不能随心所欲操纵数据,这种感觉不是特别好.于是在azure发布后,我就尝试使用azure来做为个人 ...

  7. CH5102 Mobile Service【线性dp】

    5102 Mobile Service 0x50「动态规划」例题 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个 ...

  8. CH5102 Mobile Service

    CH5102 Mobile Service 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去.某一时刻只有一 ...

  9. CH 5102 Mobile Service(线性DP)

    CH 5102 Mobile Service \(solution:\) 这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求.所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有 ...

随机推荐

  1. poj3185//BFS随便切...

    //poj 3185 2 //利用bit,通过位运算切换状态 ,然后BFS一下,轻易水过. 3 //说完好像很简单...是的,简单是简单,弱第一次以这种位运算姿势过题,太劲.膜思路 ORZ... 4 ...

  2. go语言 rsa加密

    // rsa.go package main import ( "crypto/rand" "crypto/rsa" "crypto/x509&quo ...

  3. bzoj 2565: 最长双回文串【manacher+线段树】

    因为我很愚蠢所以用了很愚蠢的O(nlogn)的manacher+线段树做法 就是开两个线段树mn和mx分别表示左端点在i的最长回文子串和右端点在i的最长回文子串 用manacher求出每个点的最长回文 ...

  4. hbase-shell + hbase的java api

    本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装   .HBase的伪分布模式(1节点)的启动    .HBas ...

  5. 将picpick汉化及矩形截屏

  6. PHP的知识点总结1

    PHP 基础知识总结 2015-06-03 分类: 编程技术   PHP 代表 PHP: Hypertext Preprocessor PHP 文件可包含文本.HTML.JavaScript代码和 P ...

  7. P1984 [SDOI2008]烧水问题

    题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t ...

  8. ES6初探——编译环境搭建

    不好意思我又要来写操作文档了,看起来更像wiki的博客(如果你想深入学习,请阅读文末列的参考资料).本文将示例如何把ES6编译成ES5. 首先,你要自行查阅什么是ES6,和ES5.javascript ...

  9. AJPFX总结heap和stack有什么区别?

    栈是后进先出的线性表结构,存取速度比堆快.创建对象的时候new一个对象,引用存在栈上具体的内容存在堆上. 栈与堆都是Java用来在RAM中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不 ...

  10. spring-bean(三)

    配置方式:通过工厂方法配置bean,通过FactoryBean配置bean 配置形式:基于注解的方式 组件扫描 泛型依赖注入 静态工厂方法 /** * 静态工厂方法:直接调用某一个类的静态方法就可以返 ...