首页 > 其他分享 >P1433 吃奶酪

P1433 吃奶酪

时间:2024-04-07 21:24:44浏览次数:6  
标签:pointlst point double 奶酪 P1433 dp include 号点

状态压缩模板题目
链接:https://www.luogu.com.cn/problem/P1433
说明:
dp[s][j]表示的是含有j号点s集合,以j号点为终点的最小旅行商距离!
那么dp[s][j] = min(dp[s][j],dp[s^(1<<j)][k] + dist(j,k));
其中:dp[s^(1<<j)][k]指的是去掉s中的j号点,并且以k为终点的距离
记忆并理解

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;





struct point
{
	double x, y;
}pointlst[20];
double dist(point x, point y) { return sqrt((double)pow(x.x - y.x, 2) + (double)pow(x.y - y.y, 2)); }
double dp[1 << 17][17];

int n;
int main()
{
	for (int i = 0; i < (1 << 17); i++)for (int j = 0; j < 17; j++)dp[i][j] = 0x3f3f3f;
	cin >> n;
	for (int i = 1; i <= n; i++)cin >> pointlst[i].x >> pointlst[i].y;
	dp[1][0] = 0;
	pointlst[0].x = pointlst[0].y = 0;
	n++;
	for (int s = 1; s < (1 << n); s++)
		for (int j = 0; j < n; j++)
			if ((s >> j) & 1)//如果s有j号点
				for (int k = 0; k < n; k++)
					if ((s ^ (1 << j)) >> k & 1)//如果s去掉j号点,还有k号点。
						dp[s][j] = min(dp[s][j], dp[s^(1<<j)][k] + dist(pointlst[k], pointlst[j]));
	double mini = 0x3f3f3f;
	for (int i = 1; i < n; i++)
		mini = min(mini, dp[(1 << n) - 1][i]);
	printf("%.2f", mini);
	return 0;
}

OwO!

标签:pointlst,point,double,奶酪,P1433,dp,include,号点
From: https://www.cnblogs.com/zzzsacmblog/p/18119889

相关文章

  • 十五 528. 奶酪 (并查集)
    528.奶酪(并查集)思路:大体就是并查集的模板,空洞数组从1到n,增加0作为下表面,n+1作为上表面,遍历所有空洞,若与上下表面相切或是相交就将ijoin到0或n+1,然后再比较任意两个空洞,两者相切或是相交就join起来,最后判断0与n+1是否相连。importjava.util.*;publicclassMain{......
  • 洛谷题单指南-搜索-P1433 吃奶酪
    原题链接:https://www.luogu.com.cn/problem/P1433题意解读:计算经过所有奶酪一次的总路径最短,可以采用dfs、dp等方法。解题思路:最直接的思路是DFS,暴搜所有的路径方案,计算最小距离,n最大是15,复杂度为15!≈10^12,必定会超时,先保证正确性,得到部分分:50分代码:#include<bits/stdc++.h......
  • P3958 [NOIP2017 提高组] 奶酪
    原题链接思路并查集然后看看是否存在上表面联通的洞与下表面联通的洞位于同一集合code#include<bits/stdc++.h>usingnamespacestd;doublen,h,r;intfa[1005];vector<int>up,down;struct{doublex,y,z;}hole[1005];doubledis(inti,intj){returnpo......
  • 典型二分:杰瑞吃奶酪
    题目描述:某一天,老鼠杰瑞抓住了一个机会,成功的到达了冰箱的附近,正当杰瑞打开冰箱门,想要享受美味的奶酪的时候,没想到冰箱里的奶酪太多了,奶酪洒了一地。汤姆猫听到了这个动静,正在火速赶往冰箱想要抓住杰瑞。杰瑞凭借与汤姆多年对抗的经历,仅凭借汤姆的脚步声便能推断汤姆还有多久抵达......
  • NOIP2014 D2T1 奶酪
    NOIP2014奶酪题面:NOIP2014提高组D2T1现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为\(z=0\),奶酪的上表面为\(z=h\)。现在,奶酪的下表面有一只小......
  • 2611. 老鼠和奶酪
    title:2611.老鼠和奶酪tags:-LeetCode-贪心-排序2023年6月7日23:18:51目录2611.老鼠和奶酪-力扣(LeetCode)Solution2611.老鼠和奶酪-力扣(LeetCode)有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉。下标为i 处的奶酪被吃掉的得分为:......
  • Leetcode 2611. 老鼠和奶酪
    题目:有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉。下标为i 处的奶酪被吃掉的得分为:如果第一只老鼠吃掉,则得分为 reward1[i] 。如果第二只老鼠吃掉,则得分为 reward2[i] 。给你一个正整数数组 reward1 ,一个正整数数组 reward2 ,和一个非负整......
  • 2023.6.7 老鼠和奶酪
    贪心+排序。由于第一只老鼠一定要吃k个奶酪的,为了让答案最大,一定要吃k个收益最大的奶酪。而reward1比reward2大的越多,收益就越多。所有可以按照reward1-reward2进行从大到小的排序,排完序后前k个奶酪由第一个老鼠吃,后面的所有奶酪由第二个老鼠吃,得到的就是最大得分。usestd::......
  • 2611. 老鼠和奶酪
    2611.老鼠和奶酪有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉。下标为i 处的奶酪被吃掉的得分为:如果第一只老鼠吃掉,则得分为 reward1[i] 。如果第二只老鼠吃掉,则得分为 reward2[i] 。给你一个正整数数组 reward1 ,一个正整数数组 reward2 ,......
  • 2611. 老鼠和奶酪
    有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉。下标为i 处的奶酪被吃掉的得分为:如果第一只老鼠吃掉,则得分为 reward1[i] 。如果第二只老鼠吃掉,则得分为 reward2[i] 。给你一个正整数数组 reward1 ,一个正整数数组 reward2 ,和一个非负整数 k......