zoukankan      html  css  js  c++  java
  • 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[1001][201][201],n,m,t,l,c[201][201],p[1001],ans;
    template<typename T>inline void read(T &x)
    {
        x=0;T f=1,ch=getchar();
        while(!isdigit(ch)) ch=getchar();
        if(ch=='-') f=-1, ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
        x*=f;
    }
    int main()
    {
        read(t);
        while(t--) {
        int ans=2139062143;
        read(l);read(n);
        for(int i=1;i<=l;i++)
            for(int j=1;j<=l;j++)
                read(c[i][j]);
        memset(f,0x7f,sizeof(f));
        for(int i=1;i<=n;i++) {
            read(p[i]);
        }
        f[0][1][2]=c[3][p[1]];
        f[0][2][3]=c[1][p[1]];
        f[0][1][3]=c[2][p[1]];
        p[0]=3,f[0][1][2]=0;
        for(int k=1;k<=n;k++)
         for(int i=1;i<=l;i++)
           for(int j=1;j<=l;j++)
             if(i!=j&&p[k-1]!=j&&p[k-1]!=i)
             {
                 f[k][i][j]=min(f[k][i][j],f[k-1][i][j]+c[p[k-1]][p[k]]);
                 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]]);
             }
        for(int i=1;i<=l;i++)
            for(int j=1;j<=l;j++) {
                if(i!=j&&i!=p[n]&&j!=p[n])
                    ans=min(ans,f[n][i][j]);
            }
        printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    mac 系统下删除目录的所有.svn文件
    java DES加密解密文件
    也许,未来需要重新规划
    android选择图片或拍照图片上传到服务器(包括上传参数)
    iOS DES ECB模式对称加密解密
    iOS开发中防止键盘挡住UITextField解决方案
    xCode 4.X 免证书真机公布及调试
    iOS 获取手机的型号,系统版本,软件名称,软件版本
    java DES ECB模式对称加密解密
    解决error: failed to launch"/private/var/mobile/Applications/XX" timed out waiting for app to launch
  • 原文地址:https://www.cnblogs.com/Tyouchie/p/10668379.html
Copyright © 2011-2022 走看看