zoukankan      html  css  js  c++  java
  • ch_5102 Mobile Service

    这题太tm毒瘤了

    边界一大堆

    优化:优化状态,减少一维

    题解:https://www.luogu.org/blog/Tony102/solution-sp703

    #include<iostream>
    #include<cstdio>
    
    #define ri register int
    #define u int
    
    namespace opt {
    
        inline u in() {
            u x(0),f(1);
            char s(getchar());
            while(s<'0'||s>'9') {
                if(s=='-') f=-1;
                s=getchar();
            }
            while(s>='0'&&s<='9') {
                x=(x<<1)+(x<<3)+s-'0';
                s=getchar();
            }
            return x*f;
        }
    
    }
    
    using opt::in;
    
    #include<cstring>
    
    #define NN 1005
    #define MM 1005
    
    namespace mainstay {
    
        u N,M,c[NN][NN],a[NN],f[2][205][205];
    
        inline void solve() {
            N=in(),M=in();
            for(ri i(1); i<=N; ++i) {
                for(ri j(1); j<=N; ++j) {
                    c[i][j]=in();
                }
            }
            for(ri i(1); i<=M; ++i) a[i]=in();
            memset(f,0x3f,sizeof(f));
            f[0][1][2]=0,a[0]=3;
            for(ri x(1); x<=M; ++x) {
                u i(x&1);
                std::memset(f[i],0x3f,sizeof(f[i]));
                for(ri j(1); j<=N; ++j) {
                    if(j!=a[x-1])
                    for(ri k(1); k<=N; ++k) {
                        if(k!=j&&k!=a[x-1]) {
                            if(j!=a[x]&&k!=a[x]) f[i][j][k]=std::min(f[i^1][j][k]+c[a[x-1]][a[x]],f[i][j][k]);
                            if(k!=a[x]&&a[x]!=a[x-1]) f[i][a[x-1]][k]=std::min(f[i^1][j][k]+c[j][a[x]],f[i][a[x-1]][k]);
                            if(j!=a[x]&&a[x]!=a[x-1]) f[i][j][a[x-1]]=std::min(f[i^1][j][k]+c[k][a[x]],f[i][j][a[x-1]]);
                        }
                    }
                }
                u _y(0);
            }
            u ans(0x7fffffff);
            for(ri i(1); i<=N; ++i)
                for(ri j(1); j<=N; ++j) 
                    if(i^j&&i^a[M]&&j^a[M]) 
                        ans=std::min(ans,f[(M&1)][i][j]);
            std::cout<<ans;
        }
    
    }
    
    int main() {
    
        //freopen("x.txt","r",stdin);
        std::ios::sync_with_stdio(false);
        mainstay::solve();
    
    }
  • 相关阅读:
    shell入门-cut命令
    shell入门-特殊符号
    shell入门-系统和用户的配置文件
    shell入门-变量
    shell入门-shell特性
    linux命令-yum工具详解
    linux命令-rpm查询包
    linux命令-rpm安装和卸载
    math 数学模块
    random 随机模块
  • 原文地址:https://www.cnblogs.com/ling-zhi/p/11801735.html
Copyright © 2011-2022 走看看