zoukankan      html  css  js  c++  java
  • SP703 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() { R x=0,f=1;
    	register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
    	do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
    } const int N=201,M=1001;
    int T,n,m,a[M];
    int c[N][N],f[2][N][N];
    inline void main() {
    	T=g(); while(T--) {
    		n=g(),m=g(); for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) c[i][j]=g();
    		for(R i=1;i<=m;++i) a[i]=g();
    		memset(f[0],0x3f,sizeof f[0]); f[0][1][2]=0,a[0]=3; R p=0,l=1;
    		for(R i=1;i<=m;++i) { p^=1,l^=1,memset(f[p],0x3f,sizeof f[p]);
    			for(R j=1;j<=n;++j) if(j!=a[i-1]) for(R k=1;k<=n;++k) if(j!=k&&k!=a[i-1]) {
    				f[p][j][k]=min(f[p][j][k],f[l][j][k]+c[a[i-1]][a[i]]);
    				f[p][j][a[i-1]]=min(f[p][j][a[i-1]],f[l][j][k]+c[k][a[i]]);
    				f[p][a[i-1]][k]=min(f[p][a[i-1]][k],f[l][j][k]+c[j][a[i]]);
    			}
    		} R ans=1e9;
    		for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) 
    			if(i!=j&&i!=a[m]&&j!=a[m]) ans=min(ans,f[p][i][j]);
    		printf("%d
    ",ans);
    	}	
    }
    } signed main() {Luitaryi::main(); return 0;}
    

    2019.09.18
    58

  • 相关阅读:
    maven笔记
    enum笔记
    mysql笔记
    git笔记
    spark笔记
    使用GitHub进行团队合作
    深度学习网站
    顶级论文索引网站
    研究生-数学建模集
    算法练习网站
  • 原文地址:https://www.cnblogs.com/Jackpei/p/11545794.html
Copyright © 2011-2022 走看看