为什么加强版过了这题不过啊,已经很仔细审题了,大佬能看看还有哪不一样吗QAQ
using namespace std;
typedef long long ll;
void rd(int &p){
int f=1;p=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
p*=f;
}
void rdl(ll &p){
int f=1;p=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
p*=f;
}
const int N=3e3+50;
int t,l,n,f[2][305][305],c[305][305],a[N],u;
unsigned char pr[N][305][305],an[N],b[2][N],d[305];
int main(){
t=1;
while(t--){
rd(l),rd(n);
for(int i(1);i<=l;++i){
for(int j(1);j<=l;++j){
rd(c[i][j]);
}
}
memset(f,0x3f,sizeof(f));
f[0][1][2]=0;a[0]=3;
for(int i(1);i<=n;++i)rd(a[i]);
for(int i(0);i<n;++i){
memset(f[(i+1)&1],0x3f,sizeof(f[(i+1)&1]));
for(int j(1);j<=l;++j){
for(int k(1);k<=l;++k){
if(j==k||j==a[i]||k==a[i])continue;
if(f[(i+1)&1][j][k]>f[i&1][j][k]+c[a[i]][a[i+1]]){
f[(i+1)&1][j][k]=f[i&1][j][k]+c[a[i]][a[i+1]];
pr[i+1][j][k]=0;
}
if(f[(i+1)&1][a[i]][k]>f[i&1][j][k]+c[j][a[i+1]]){
f[(i+1)&1][a[i]][k]=f[i&1][j][k]+c[j][a[i+1]];
pr[i+1][a[i]][k]=j;
}
if(f[(i+1)&1][j][a[i]]>f[i&1][j][k]+c[k][a[i+1]]){
f[(i+1)&1][j][a[i]]=f[i&1][j][k]+c[k][a[i+1]];
pr[i+1][j][a[i]]=k;
}
if(f[(i+1)&1][k][j]>f[i&1][j][k]+c[a[i]][a[i+1]]){
f[(i+1)&1][k][j]=f[i&1][j][k]+c[a[i]][a[i+1]];
pr[i+1][k][j]=0;
}
if(f[(i+1)&1][k][a[i]]>f[i&1][j][k]+c[j][a[i+1]]){
f[(i+1)&1][k][a[i]]=f[i&1][j][k]+c[j][a[i+1]];
pr[i+1][k][a[i]]=j;
}
if(f[(i+1)&1][a[i]][j]>f[i&1][j][k]+c[k][a[i+1]]){
f[(i+1)&1][a[i]][j]=f[i&1][j][k]+c[k][a[i+1]];
pr[i+1][a[i]][j]=k;
}
}
}
}
int ans=0x7fffffff,x,y,z,xx,yy,zz;
for(int i(1);i<=l;++i){
for(int j(1);j<=l;++j){
if(i==j||i==a[n]||j==a[n])continue;
if(ans>f[n&1][i][j]){
ans=f[n&1][i][j];
x=i,y=j;
}
}
}
printf("%d\n",ans);
for(int i(n);i;--i){
an[i]=pr[i][x][y];b[0][i]=x,b[1][i]=y;
if(an[i]==0)continue;
if(x==a[i-1])x=an[i];
else y=an[i];
}b[0][0]=1,b[1][0]=2;
xx=d[1]=1,yy=d[2]=2,zz=d[3]=3;
for(int i(1);i<=n;++i){
if(b[0][i]>b[1][i])swap(b[0][i],b[1][i]);
if(a[i]<b[0][i]){
x=a[i],y=b[0][i],z=b[1][i];
}
else if(a[i]<b[1][i]){
x=b[0][i],y=a[i],z=b[1][i];
}
else x=b[0][i],y=b[1][i],z=a[i];
if(d[a[i]]!=0){
printf("%d ",d[a[i]]);
continue;
}
u=6;
if(d[x]!=0)u-=d[x];
if(d[y]!=0)u-=d[y];
if(d[z]!=0)u-=d[z];
printf("%d ",u);
if(d[x]!=0){
if(xx==x)xx=0;
if(yy==x)yy=0;
if(zz==x)zz=0;
}
if(d[y]!=0){
if(xx==y)xx=0;
if(yy==y)yy=0;
if(zz==y)zz=0;
}
if(d[z]!=0){
if(xx==z)xx=0;
if(yy==z)yy=0;
if(zz==z)zz=0;
}
if(xx!=0){
d[a[i]]=d[xx];d[xx]=0;
}
if(yy!=0){
d[a[i]]=d[yy];d[yy]=0;
}
if(zz!=0){
d[a[i]]=d[zz];d[zz]=0;
}
xx=x,yy=y,zz=z;
}
}
return 0;
}```