UVa1347 Tour

        看着紫书的分析才下的手。。想象成两个人以不同的路从起点走到终点。dp(i,j)表示1~max(i,j)全部走过,两人位置分别是i和j,还需要走多长的距离。规定i>j,i和j不特指某一个人,指的是当前在前面和后面的人。


#include <iostream>    
#include <stdio.h>    
#include <cmath>    
#include <algorithm>    
#include <iomanip>    
#include <cstdlib>    
#include <string>    
#include <memory.h>    
#include <vector>    
#include <queue>    
#include <stack>    
#include <map>  
#include <set>  
#include <ctype.h>    
#define INF 1000000  
#define ll long long

  
using namespace std;  

struct point{
	int x;
	int y;
};

point pt[100];

int n;
double dp[100][100];

double dist2(point p1,point p2){
	return sqrt((double)(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

double fun(int i,int j){
	if(dp[i][j]>0)return dp[i][j];
	if(i==n){
		dp[i][j]=dist2(pt[j],pt[n]);
		return dp[i][j];
	}
	
	double re=min(fun(i+1,j)+dist2(pt[i],pt[i+1]),fun(i+1,i)+dist2(pt[j],pt[i+1]));
	dp[i][j]=re;
	return re;
}

int main(){
	
	while(cin>>n){
		for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)dp[i][j]=-1.0;
		for(int i=1;i<=n;i++){
			cin>>pt[i].x>>pt[i].y;
		}
		printf("%.2lf\n",fun(1,1));
	}
	return 0;
}


你可能感兴趣的:(dp,uva)