1. 程式人生 > >洛谷 P1433 吃奶酪(記憶化)

洛谷 P1433 吃奶酪(記憶化)

include ac代碼 如果 scan 最優 輸入 col n) 一行

題目描述

房間裏放著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 }

 

洛谷 P1433 吃奶酪(記憶化)