dp可真难呀
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int map[220][220]; int list[1100]; int dp[1100][212][220]; int L, N; int main() { scanf("%d%d", &L, &N); for (int i = 1; i <= L; i++) { for (int j = 1; j <= L; j++) { scanf("%d", &map[i][j]); } } for (int i = 1; i <= N; i++) { scanf("%d", &list[i]); } memset(dp, 0x3f3f3f3f, sizeof(dp)); dp[0][1][2] = 0; list[0] = 3; for (int i = 0; i < N; i++) { for (int x = 1; x <= L; x++) { for (int y = 1; y <= L; y++) { int pi = list[i]; int px = list[i + 1]; int v = dp[i][x][y]; if (x == y || x == pi || y == pi) continue; dp[i + 1][x][y] = min(dp[i + 1][x][y], v + map[pi][px]); dp[i + 1][pi][y] = min(dp[i + 1][pi][y], v + map[x][px]); dp[i + 1][x][pi] = min(dp[i + 1][x][pi], v + map[y][px]); } } } int ans = 0x3f3f3f3f; for (int i = 1; i <= L; i++) { for (int j = 1; j <= L; j++) { int x = list[N]; if (x == i || x == j || i == j) continue; ans = min(ans, dp[N][i][j]); } } printf("%d ", ans); return 0; }