题解 TSP 但是你有约束
作者:互联网
Description
给定一张带权完全图,求一条路径满足
- 不重复经过一个点。
- 在过点 \(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