Mobile Service

Mobile Service

有一\(1\times L\)的网格,3个人初始在1,2,3,给出从每个位置i移到另一个位置j的费用\(c[i][j]\),并且保证两个人不在同一位置,再给出n个请求,第i个请求记做\(p_i\),要求有一个人到达位置\(p_i\),问按先后顺序完成这些请求的最小费用,\(3<=L<=200, 1<=N<=1000\)。

显然要表现出这是第几个请求,且要知道3个人的位置才能转移,故设\(f[i][j][k][l]\)表示第i个请求,位置分别在j,k,l的最小费用,但是注意到\(p[i]\)已经表示了一个人的费用,故只要设\(f[i][j][k]\)表示第i个请求,有2个人在位置j,k的最小费用,于是我们有

\[f[i+1][j][k]=\max(f[i+1][j][k],f[i][j][k]+c[p[i]][p[i+1]])(p[i+1]!=j,k)\]

\[f[i+1][j][p[i]]=\max(f[i+1][j][p[i]],f[i][j][k]+c[k][p[i+1]])(p[i+1]!=p[i],j)\]

\[f[i+1][k][p[i]]=\max(f[i+1][j][p[i]],f[i][j][k]+c[j][p[i+1]])(p[i+1]!=p[i],k)\]

边界:\(f[0][1][2]=0,p[0]=3\),其余无限大

答案:\(\min_{i,j=1}^L f[n][i][j](i\neq j)\)

参考代码:

阶段实现

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define intmax 0x7fffffff
using namespace std;
int c[201][201],dp[1001][201][201],
    p[1001];
il void read(int&);
template<class free>
il free Min(free,free);
int main(){
    int l,n;
    read(l),read(n),memset(dp,66,sizeof(dp));
    for(int i(1),j;i<=l;++i)
        for(j=1;j<=l;++j)read(c[i][j]);
    for(int i(1);i<=n;++i)read(p[i]);
    p[0]=3,dp[0][1][2]=0;
    for(int i(0),j,k;i<n;++i)
        for(j=1;j<=l;++j)
            for(k=1;k<=l;++k){
                if(j==k||j==p[i]||k==p[i])continue;
                if(p[i+1]!=j&&p[i+1]!=k)dp[i+1][j][k]=Min(dp[i+1][j][k],dp[i][j][k]+c[p[i]][p[i+1]]);
                if(p[i+1]!=j&&p[i+1]!=p[i])dp[i+1][j][p[i]]=Min(dp[i+1][j][p[i]],dp[i][j][k]+c[k][p[i+1]]);
                if(p[i+1]!=k&&p[i+1]!=p[i])dp[i+1][k][p[i]]=Min(dp[i+1][k][p[i]],dp[i][j][k]+c[j][p[i+1]]);
            }
    int ans(intmax);
    for(int i(1),j;i<=l;++i)
        for(j=1;j<=l;++j)ans=Min(ans,dp[n][i][j]);
    printf("%d",ans);
    return 0;
}
template<class free>
il free Min(free a,free b){
    return a<b?a:b;
}
il void read(int &x){
    x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

dfs实现(超了时,恳求优化)

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define intmax 0x7fffffff
using namespace std;
int w[201][201],p[201],
    dp[1001][201][201],n;
void search(int,int,int);
il void read(int&);
int main(){
    int l;read(l),read(n);
    for(int i(1),j;i<=l;++i)
        for(j=1;j<=l;++j)read(w[i][j]);
    for(int i(1);i<=n;++i)read(p[i]);
    memset(dp,66,sizeof(dp));
    dp[0][1][2]=0,p[0]=3,search(0,1,2);
    int ans(intmax);
    for(int i(1),j;i<=l;++i)
        for(j=1;j<=l;++j)
            ans=ans>dp[n][i][j]?dp[n][i][j]:ans;
    printf("%d",ans);
    return 0;
}
void search(int a,int b,int c){
    if(a==n)return;int opt;
    if(p[a+1]!=b&&p[a+1]!=c)
        if((opt=dp[a][b][c]+w[p[a]][p[a+1]])<dp[a+1][b][c])
            dp[a+1][b][c]=opt,search(a+1,b,c);
    if(p[a+1]!=p[a]){
        if(p[a+1]!=b)
            if((opt=dp[a][b][c]+w[c][p[a+1]])<dp[a+1][b][p[a]])
                dp[a+1][b][p[a]]=opt,search(a+1,b,p[a]);
        if(p[a+1]!=c)
            if((opt=dp[a][b][c]+w[b][p[a+1]])<dp[a+1][c][p[a]])
                dp[a+1][c][p[a]]=opt,search(a+1,c,p[a]);
    }
}
il void read(int &x){
    x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

原文地址:https://www.cnblogs.com/a1b3c7d9/p/10901645.html

时间: 2024-11-06 12:19:22

Mobile Service的相关文章

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.公司必须按顺序依次满足所有请求,目标是最小化公司花费,请你帮忙计算这

【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]的那个

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