zoukankan      html  css  js  c++  java
  • 洛谷 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 }
    
    
    
     
  • 相关阅读:
    intellij idea
    this.getClass().getResource(String) 路径问题
    org.hibernate.AssertionFailure: null id 错误
    Hibernate 映射
    关于idea 在创建maven 骨架较慢问题解决
    常用base.css
    form表单样式
    ul li自适应居中导航
    table-cell实现未知宽高图片,文本水平垂直居中在div
    多行文字水平垂直居中在div
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/10367319.html
Copyright © 2011-2022 走看看