移动服务

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;
}

  

寻找真正的热爱
原文地址:https://www.cnblogs.com/lesning/p/11985414.html