栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【每日一题】洛谷 p1433 吃奶酪 状压dp

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【每日一题】洛谷 p1433 吃奶酪 状压dp

- [P1433 吃奶酪](https://www.luogu.com.cn/problem/P1433)

换一种类型,这次求长度最小值,(n<15)接着状压

题目:房间里放着 nn 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0)(0,0) 点处。

梳理状态:1吃了几个,2吃了哪几个 (dp[i个][吃完第i个是什么状态])

写出递推式

dp[j][i]=min(dp[j][i],dp[p][i-(1<<(j-1))]+a[p][j]);
//当前距离  p:上一个是哪个点  i-(1<<(j-1)):上一个状态 a[p][j]距离

思路:先求出任意两点间距离,按照状态选择结束启示两点进行遍历。

for(int i=1;i<(1< 

别忘了初始化,最后给出ac代码

#include
using namespace std;
double a[20][20];
double vx[20],vy[20];
double dp[16][20005];
double dis(int p1,int p2){
	return sqrt((vx[p1]-vx[p2])*(vx[p1]-vx[p2])+(vy[p1]-vy[p2])*(vy[p1]-vy[p2]));
}
int main(){
	double ans=1000000005;//这个有点呆qwq
	int n;
	cin>>n;
	memset(dp,127,sizeof(dp));//初始化最大值
	for(int i=1;i<=n;i++){
		cin>>vx[i];
		cin>>vy[i];
	}
	
	for(int i=0;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			a[i][j]=dis(i,j);
			a[j][i]=a[i][j];
		}
	}
	
	for(int i=1;i<=n;i++){
		dp[i][(1<<(i-1))]=a[0][i];//先走第一步
	}
	
	for(int i=1;i<(1< 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296612.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号