【CH5102】Mobile Service

线型动态规划的好题……

分析题意,不难设计出状态:f[i][x][y][z]表示完成第i个任务后,三个人分别在x,y,z位置时的花费。但是这样的状态时间与空间都无法承受,不可行。

再次考虑:当完成第i个任务后,其中一人必定在p[i]上,因此状态可以减少一维:f[i][x][y]表示完成第i个任务后,另外两个人(除了这一步移动的到p[i]的那个人)分别在x,y位置时的花费。

考虑状态转移:若当前位于状态f[i][x][y],当前要处理第i+1个任务,要去往p[i+1]位置。设当前位于p[i]的那个人为z。c数组表示花费(见题目描述)。

1、如果让x去p[i+1](y,z不在那里),则f[i+1][y][z]=min(f[i+1][y][z],f[i][x][y]+c[x][p[i+1]]).

2、如果让y去p[i+1](x,z不在那里),则f[i+1][x][z]=min(f[i+1][x][z],f[i][x][y]+c[y][p[i+1]]).

3、如果让z去p[i+1](x,y不在那里),则f[i+1][x][y]=min(f[i+1][x][y],f[i][x][y]+c[z][p[i+1]]).

另外,我们发现第i个任务的状态只能从第i-1个任务的状态转移过来,也就是说我们可以用滚动数组优化空间,只存i和i-1,每次计算都覆盖掉原来的状态。

这样我们就不难得出正解。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int n,m;
 6 int c[210][210],ans,p[1010];
 7 int f[2][210][210];
 8 int main() {
 9     scanf("%d%d",&m,&n);
10     for(int i=1;i<=m;i++)
11         for(int j=1;j<=m;j++)
12             scanf("%d",&c[i][j]);
13     for(int i=1;i<=n;i++) scanf("%d",&p[i]);
14     p[0]=3;
15     memset(f,0x3f,sizeof(f));
16     f[0][1][2]=0;
17     for(int i=1;i<=n;i++) {
18         for(int x=1;x<=m;x++) {
19             for(int y=1;y<=m;y++)
20                 if(f[i-1&1][x][y]!=0x3f3f3f3f) {
21                     int z=p[i-1];
22                     if(x!=p[i]&&y!=p[i]) f[i&1][x][y]=min(f[i&1][x][y],f[i-1&1][x][y]+c[z][p[i]]);
23                     if(x!=p[i]&&z!=p[i]) f[i&1][x][z]=min(f[i&1][x][z],f[i-1&1][x][y]+c[y][p[i]]);
24                     if(y!=p[i]&&z!=p[i]) f[i&1][y][z]=min(f[i&1][y][z],f[i-1&1][x][y]+c[x][p[i]]);
25                     f[i-1&1][x][y]=0x3f3f3f3f;
26                 }
27         }
28     }
29     ans=1<<30;
30     for(int i=1;i<=m;i++)
31         for(int j=1;j<=m;j++)
32             ans=min(ans,f[n&1][i][j]);
33     printf("%d\n",ans);
34     return 0;
35 }

AC Code

原文地址:https://www.cnblogs.com/shl-blog/p/10660405.html

时间: 2024-10-09 21:18:22

【CH5102】Mobile Service的相关文章

【Android】Kill Service

花了一天时间对如何Android保证Service不被杀死研究了一下,我的手机是Nexus5,系统4.4.2. 杀死一个Service通常有以下几种可能: 1)APP自己杀死(包括调用stopService等方法),以及因为使用bindService后context自己onDestory(): 2)第三方软件,比如360手机卫士,腾讯手机管家,猎豹清理大师等: 3)在"设置"-->"应用"-->"正在运行",找到应用后点击进去,停止S

【IOI2001】【poj1195】Mobile phones(二维树状数组)

一维树状数组维护的是区间和,最后统计的是1~x数的和,而二维树状数组维护的是一个面的和,最后统计的是 (1,1)~(x,y)区域内数的和 (x,y)所维护的面大小由x,y共同决定,x决定高度,y决定宽度 add和query操作的两层循环结合二分图理解比较直观 如何分呢?首先,我们按照X坐标,把整个表格分成部分,并对每个部分按照X坐标继续二分下去,同时,我们将分得的每个部分再按Y坐标进行二分,并记下最终分得的每个部分的移动电话总数. “多重二分”的结果,实际上类似于一维情况下二分的结果,也是形成一

【poj1195】Mobile phones(二维树状数组)

题目链接:http://poj.org/problem?id=1195 [题意] 给出一个全0的矩阵,然后一些操作 0 S:初始化矩阵,维数是S*S,值全为0,这个操作只有最开始出现一次 1 X Y A:对于矩阵的X,Y坐标增加A 2 L B R T:询问(L,B)到(R,T)区间内值的总和 3:结束对这个矩阵的操作 [思路] 二维树状数组单点更新+区域查询,可作为模板题. 注意坐标是从0开始,所以要+1 [代码] 1 #include<cstdio> 2 #include<cstrin

【android】在Service的onStartCommand()中调用stopself()应该注意的问题

在Service的onStartCommand()中调用stopself()后并不会立刻destroy掉service,而是等onStartCommand()执行完才destroy. public class TestService extends Service { private String TAG = "TestService"; @Override public void onCreate() { // TODO Auto-generated method stub Log.

【转】Web Service单元测试工具实例介绍之SoapUI

SoapUI 是当前比较简单实用的开源Web Service 测试工具,提供桌面应用程序和IDE 插 件程序两种使用方式.能够快速构建项目和组织测试用例是该工具的一大特性,下面将通过实例介绍如果使用SoapUI 进 行Web Service 单元测试. l 构建项目 SoapUI 工具中的项目(Project )是由一个或多个Web Service 组成的,这里我们以"中国电视节目预告 Web 服务: http://www.webxml.com.cn/webservices/ChinaTVpro

【转】android service 之二(IntentService)

原文网址:http://rainbow702.iteye.com/blog/1143286 不管是何种Service,它默认都是在应用程序的主线程(亦即UI线程)中运行的.所以,如果你的Service将要运行非常耗时或者可能被阻塞的操作时,你的应用程序将会被挂起,甚至会出现ANR错误.为了避免这一问题,你应该在Service中重新启动一个新的线程来进行这些操作.现有两种方法共大家参考: ① 直接在Service的onStartCommand()方法中重启一个线程来执行,如: Java代码   @

【转】Android Service完全解析,关于服务你所需知道的一切(下) ---- 不错

原文网址:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式.Service与Thread的关系.以及如何创建前台Service.以上

【转载】Android Service完全解析,关于服务你所需知道的一切(上)

文章转载至:http://blog.csdn.net/guolin_blog/article/details/11952435 这是郭霖写的.......就是写 "第一行代码"的那个厉害人物,大师就是大师,和大师写的文章相比自己还差的挺多 文章写的太好了......感觉自己也写不出如此好的介绍Service的文章,希望多转载,让更多的人看到 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Serv

【android】在Service中新建TextView

在Activity中new TextView的时候,发现传入的参数是Context,不是必须为Activity,就想:在Service中新建一个View的话能否正常使用? Service中:` public class MyJobService extends JobService { public static TextView myView; @Override public boolean onStartJob(JobParameters params) { myView = new Te