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 }
    
    
    
     
  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/10367319.html
Copyright © 2011-2022 走看看