这题太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(); }