AcWing 274. 移动服务
原题链接
中等
作者:
橙柚哥哥
,
2024-04-17 18:47:45
,
所有人可见
,
阅读 2
求赞!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int L=210,N=1010;
int l,n,c[L][L],p[N],dp[N][L][L],ans=2e9;
int main () {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>l>>n;
for(int i=1; i<=l; i++)
for(int j=1; j<=l; j++) cin>>c[i][j];
for(int i=1; i<=n; i++) cin>>p[i];
memset(dp,0x3f,sizeof(dp));
p[0]=3;
dp[0][1][2]=0;
for(int i=0; i<n; i++)
for(int x=1; x<=l; x++)
for(int y=1; y<=l; y++) {
int z=p[i];
if(x==y || x==z || y==z) continue;
dp[i+1][x][y]=min(dp[i+1][x][y],dp[i][x][y]+c[z][p[i+1]]);
dp[i+1][x][z]=min(dp[i+1][x][z],dp[i][x][y]+c[y][p[i+1]]);
dp[i+1][z][y]=min(dp[i+1][z][y],dp[i][x][y]+c[x][p[i+1]]);
}
for(int x=1; x<=l; x++)
for(int y=1; y<=l; y++) {
if(x==y || x==p[n] || y==p[n]) continue;
ans=min(ans,dp[n][x][y]);
}
cout<<ans;
return 0;
}