其他分享
首页 > 其他分享> > 题解 TSP 但是你有约束

题解 TSP 但是你有约束

作者:互联网

Description

给定一张带权完全图,求一条路径满足

  1. 不重复经过一个点。
  2. 在过点 \(i\) 时,\(1\cdots i - 1\) 要么全访问过,要么都没有访问过。

点数 \(n\) 有 \(1\le n\le 1e3\)

Solution

% 你赛唯一做出来一道题 wwwwwwww QAQ

花了 1h30min 发现自己找的规律不对 QAQ

所以找规律最好还是要写个暴力验证一下(((((


首先这题编号一定是一个单谷序列。

我们考虑从大到小往序列里面加数,单谷序列有下降一段,谷底和上升一段。

从小到大加数,要么放最前面,要么放最后面。

\(pre\) 代表序列第一个数字,\(last\) 代表最后一个数字,\(u\) 代表加入的数字,\(u\) 要么然放最前面,要么然放最后面

代码

#include <iostream>
#include <cstring>
#define MAXN 1541
using namespace std;
int n, d[MAXN + 10][MAXN + 10];
int f[MAXN + 10][MAXN + 10];
int dfs(int u, int pre, int last) {//记忆化搜索 qwq
	if(f[pre][last] != -1) return f[pre][last];
	if(u == 1) return d[1][pre] + d[1][last];
	f[pre][last] = min(d[last][u] + dfs(u - 1, pre, u), d[pre][u] + dfs(u - 1, u, last));
	return f[pre][last];
}
int main() {
//	freopen("in.txt", "r", stdin);
//	freopen("1.txt", "w", stdout);
	memset(f, -1, sizeof(f));
	cin >> n;
	for(int p = 1; p <= n; p++)
		for(int i = 1; i <= n; i++)
			cin >> d[p][i];
	cout << dfs(n, 0, 0) << endl;
} 

标签:pre,10,last,int,题解,约束,MAXN,要么,TSP
来源: https://www.cnblogs.com/thirty-two/p/16608184.html