• 洛谷 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 }
    
    
    
     
  • 相关阅读:
    CSS边框
    各大网站注册的用处(个人看法)
    20121011 外边距
    20120921碎碎念
    20121011 CSS一
    20120919碎碎念
    CSS 文本装饰属性
    外边距合并
    EverBox开发笔记1
    “Core Data”中的“dynamic implementation”
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/10367319.html
Copyright © 2020-2023  润新知