洛谷 P1433 吃奶酪(记忆化)

题目描述

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

输入输出格式

输入格式:

第一行一个数n (n<=15)

接下来每行2个实数,表示第i块奶酪的坐标。

两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

输出格式:

一个数,表示要跑的最少距离,保留2位小数。

输入输出样例

输入样例#1: 
4
1 1
1 -1
-1 1
-1 -1
输出样例#1: 
7.41
解题思路:
记忆化搜索,看代码(注释)
AC代码:
 1 #include<cstdio>
 2 #include<cmath>
 3 #define min(a,b) a<b?a:b
 4 using namespace std;
 5 int n;
 6 double f[20][20];
 7 double x[20],y[20],ans = 999999999999.0;//要求最小值,将答案初始化很大很大 
 8 bool v[20];
 9 void dfs(int s,int now,double l) {
10     if(l > ans) return ;//剪枝,如果没有会TLE,如果当前路径已经比答案大,那么不能是最优解了,直接返回 
11     if(s == n) {//走完n个点 
12         ans = min(ans,l);//更新答案 
13         return ;
14     }
15     for(int i=1;i<=n;i++) //枚举所有点 
16           if(!v[i]) {//没走过 
17             v[i]=1; //标记 
18             dfs(s+1,i,l+f[now][i]);   
19             v[i]=0;  //回溯 
20         }
21 }
22 int main()
23 {
24     scanf("%d",&n);
25     for(int i = 1;i <= n; i++)
26         scanf("%lf%lf",&x[i],&y[i]);
27     x[0] = 0;y[0] = 0;
28     for(int i = 0;i <= n; i++)
29         for(int j = 0;j <= n; j++)
30             f[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//预处理两点的距离 
31     dfs(0,0,0.0);//已走过0个点  上一个点是第0个点  已走了长0.0的路径 
32     printf("%.2lf",ans);
33     return 0;
34 }
 
   
  
 

猜你喜欢

转载自www.cnblogs.com/lipeiyi520/p/10367319.html