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-1][j][k][l]+c(j,p[i]));

f[i][j][p[i]][l]=min(f[i][j][p[i]][l],f[i-1][j][k][l]+c(k,p[i]));

f[i][j][k][p[i]]=min(f[i][j][k][p[i]],f[i-1][j][k][l]+c(l,p[i]));

但以上的复杂度卡死你都过不去,所以优化状态;

因为对于i,肯定有一个人处于p[i];所以把p[i]舍弃

f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+a[p[i]][p[i+1]]);
f[i+1][p[i]][k]=min(f[i+1][p[i]][k],f[i][j][k]+a[j][p[i+1]]);
f[i+1][j][p[i]]=min(f[i+1][j][p[i]],f[i][j][k]+a[k][p[i+1]]);

注意p[0]=3;

f[0][1][2]=0;

#include <bits/stdc++.h>
using namespace std;
int a[1010][1010];
int f[1010][210][210];
int p[10010];
int main()
{
    int t;
    cin>>t;
    while(t--){
        int l,n;
        cin>>l>>n;
        for(register int i=1;i<=l;i++){
            for(register int j=1;j<=l;j++){
                scanf("%d",&a[i][j]);
            }
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&p[i]);
        }
        memset(f,0x3f,sizeof(f));
        f[0][1][2]=0;
        p[0]=3;
        for(register int i=0;i<n;i++){
            for(register int j=1;j<=l;j++){
                for(register int k=1;k<=l;k++){
                    if(j==p[i]) continue;
                    if(k==p[i]) continue;
                    if(j==k) continue;
                    if(j!=p[i+1]&&k!=p[i+1]) f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+a[p[i]][p[i+1]]);
                    if(p[i]!=p[i+1]&&k!=p[i+1]) f[i+1][p[i]][k]=min(f[i+1][p[i]][k],f[i][j][k]+a[j][p[i+1]]);
                    if(j!=p[i+1]&&p[i]!=p[i+1]) f[i+1][j][p[i]]=min(f[i+1][j][p[i]],f[i][j][k]+a[k][p[i+1]]);
                }
            }
        }
        int minn=INT_MAX;
        for(int i=1;i<=l;i++){
            for(int j=1;j<=l;j++){
                minn=min(minn,f[n][i][j]);
            }
        }
        cout<<minn<<endl;
    }
}

原文地址:https://www.cnblogs.com/kamimxr/p/11453518.html

时间: 2024-11-02 16:28:41

SPOJ 703 SERVICE - Mobile Service 题解的相关文章

SP703 SERVICE - Mobile Service

思路:DP 提交:1次 题解: 我们把处理到的要求作为阶段. \(f[i][x][y][z]\)表示第 \(i\) 个要求,三个人分别的位置. 发现这样有很多无用状态,因为显然在第 \(i\) 个要求后,总有一个人在 \(pos[i]\) 所以我们省掉一维. 注意第一维要滚动. 代码: #include<bits/stdc++.h> #define R register int using namespace std; namespace Luitaryi { inline int g() {

SP703 SERVICE - Mobile Service[DP]

题意翻译 Description 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动.只有被请求后,他才能移动,不允许在同样的位置出现两个员工.从位置P到Q移动一个员工的费用是C(P, Q).这个函数没有必要对称,但是C(P, P) = 0.一开始三个服务员分别在位置1,2,3,公司必须满足所有的请求. 目标是最小化公司的费用. Input 第1行:2个整数L,N(3<=L<=200, 1<=N<=100

Windows Azure之Mobile Service

我建个android app和Windows Azure的Mobile Service配合,以实现会员注册的功能,实际十分简单,微软家的东西真心好用 首先新建个Mobile Service New->Mobile Service->Create之后弹出下图的对话框 URL就自定义一个,如果有人注册了会报错,换个就好,database新建还是使用已存在的都可以,新建之后会多一步让你输入要新建的数据库的名称和密码,backend就选Javascript,点击箭头下一步 使用现存的会让你输入密码,建

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 "yes" to allow azure services to access the server. Note: this is the configuration for the server not the database. Once I did this, I tried again to

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

在使用azure之前,我一直只能做本地app,或者使用第三方提供的api,尽管大多数情况下够用,但是仍不能随心所欲操纵数据,这种感觉不是特别好.于是在azure发布后,我就尝试使用azure来做为个人数据中心,可选的方式有很多,但今天我给大家介绍的是azure mobile service. 1.创建Mobile Service Azure中创建Mobile Service很简单,与创建其他项目类似,流程如下: i. ii. iii. ii 这里我使用的是Windows Azure国际版,经过简

Windows Azure Mobile Service - Logs for diagnostics

If you get stuck on client side Mobile Service error and the error message is less useful, try to see the Logs tab in your Azure Mobile Service, you probably can get the useful information from the log reference: http://stackoverflow.com/questions/18

[TYVJ1061] Mobile Service|动态规划|滚动数组

P1061 Mobile Service 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动.被请求后,他才能移动,不允许在同样的位置出现两个员工.从p到q移动一个员工,需要花费c(p,q).这个函数没有必要对称,但是c(p,p)=0.公司必须满足所有的请求.目标是最小化公司花费. 输入格式 第一行有两个整数L,N(3<=L<=

CH5102 Mobile Service【线性dp】

5102 Mobile Service 0x50「动态规划」例题 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去.某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工.从 p 到 q 移动一个员工,需要花费 c(p,q).这个函数不一定对称,但保证 c(p,p)=0.给出N个请求,请求发生的位置分别为 p_1~p_N.公司必须按顺序依次满足所有请求,目标是最小化公司花费,请你帮忙计算这个最小花费

CH5102 Mobile Service

题意 5102 Mobile Service 0x50「动态规划」例题 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处. 如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去.某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工.从 p 到 q 移动一个员工,需要花费 c(p,q).这个函数不一定对称,但保证 c(p,p)=0. 给出N个请求,请求发生的位置分别为 p_1~p_N.公司必须按顺序依次满足所有请求,目标是最小化公司花费,请你帮忙计算这