ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 TSP 但是你有约束

2022-08-20 17:34:27  阅读:173  来源: 互联网

标签:pre 10 last int 题解 约束 MAXN 要么 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有