• SP703 SERVICE


    洛咕

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

    分析:设(f[i][x][y])表示完成了前i个请求,其中一个员工位于(p_i),两外两个员工分别位于x和y时的最小花费.

    注意到我这里没有设(f[i][x][y][z])表示完成了前i个请求,三个员工分别位于x,y和z时的最小花费.因为这样会爆空间,而我只要知道了i,就能知道其中一名员工肯定在(p_i)位置处.

    (f[i][x][y]=min(f[i][x][y],f[i-1][x][y]+c[p[i-1]][p[i]]))

    (f[i][p[i-1]][y]=min(f[i][p[i-1]][y],f[i-1][x][y]+c[x][p[i]]))

    (f[i][x][p[i-1]]=min(f[i][x][p[i-1]],f[i-1][x][y]+c[y][p[i]]))

    注意一下,因为任意两名员工不能在同一位置,故转移时只有(x!=y)(x!=p[i-1])(y!=p[i-1])时才能转移.

    不妨设(p_0=0),则初始化(f[0][1][2]=0).

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
        int s=0,w=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
        return s*w;
    }
    const int N=205;
    const int M=1005;
    int f[M][N][N],c[N][N],p[M];
    int main(){
        int T=read();
        while(T--){
    		int n=read(),m=read();
    		for(int i=1;i<=n;i++)
    	    	for(int j=1;j<=n;j++)
    				c[i][j]=read();
    		p[0]=3;
    		for(int i=1;i<=m;i++)p[i]=read();
    		memset(f,0x3f,sizeof(f));
    		f[0][1][2]=0;
    		for(int i=1;i<=m;i++)
    	    	for(int x=1;x<=n;x++)
    				for(int y=1;y<=n;y++){
    		    		if(x!=y&&x!=p[i-1]&&y!=p[i-1])
                        	f[i][x][y]=min(f[i][x][y],f[i-1][x][y]+c[p[i-1]][p[i]]);
    		    		if(x!=y&&x!=p[i-1]&&y!=p[i-1])
                        	f[i][p[i-1]][y]=min(f[i][p[i-1]][y],f[i-1][x][y]+c[x][p[i]]);
    		    		if(x!=y&&x!=p[i-1]&&y!=p[i-1])
                        	f[i][x][p[i-1]]=min(f[i][x][p[i-1]],f[i-1][x][y]+c[y][p[i]]);
    				}
    		int ans=1e9;
    		for(int i=1;i<=n;i++)
    	    	for(int j=1;j<=n;j++)
    				ans=min(ans,f[m][i][j]);
    		printf("%d
    ",ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    前端打印去除水印
    mybatis实现多数据库操作(个人封装注解版本)
    vue项目用hbuilder打包成APP后,返回键退出程序的解决办法
    Java迭代器Iterator的remove()方法的使用
    零基础学Java语言(浙江大学mooc)
    Oracle查询一个字段在哪张表里
    slf4j重定向日志输出
    SpringBoot嵌入pentaho-kettle工具实现数据trans转换和job任务手动执行
    Apache的karaf启动报错
    SpringBoot扩展接口- Bean实例化前后扩展点
  • 原文地址:https://www.cnblogs.com/PPXppx/p/10939711.html
Copyright © 2020-2023  润新知