UVA-1347Tour——巧妙的状态设计与转移

Tour
刘老师的讲解就不重复了
DP方程为:
d ( i , j ) = m i n ( d ( i + 1 , j ) + d i s ( i + 1 , i ) , d ( i + 1 , i ) + d i s ( j , i + 1 ) ) d(i,j) = min(d(i+1,j)+dis(i+1,i),d(i+1,i)+dis(j,i+1))
边界:
d ( n 1 , j ) = d i s ( n 1 , n ) + d i s ( j , n ) d(n-1,j)=dis(n-1,n)+dis(j,n)
目标:
d ( 2 , 1 ) + d i s ( 2 , 1 ) d(2,1)+dis(2,1)

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define ms0(a) memset(a,0,sizeof(a))
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;

int n;
double d[1005][1005];
struct dot{
    int x,y;
}a[1005];

double getDis(dot a,dot b)
{
    int dx = a.x-b.x,dy=a.y-b.y;
    return sqrt(dx*dx+dy*dy);
}

void init()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            d[i][j] = 1e9;
}

int main(){
    while (~scanf("%d",&n))
    {
        init();
        for(int i=1;i<=n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            a[i].x=x;a[i].y=y;
        }

        for(int j=n-2;j>=1;j--)
        {
            d[n-1][j] = getDis(a[n-1], a[n])+getDis(a[j], a[n]);
            for(int i=n-1;i-1>j;i--)
            {
                d[i-1][j] = min(d[i-1][j],d[i][j]+getDis(a[i-1], a[i]));
                d[i-1][j] = min(d[i-1][j],d[i][i-1]+getDis(a[j], a[i]));
            }
        }
        double ans = d[2][1] + getDis(a[1], a[2]);
        printf("%.2f\n",ans);
    }
    return 0;
}
发布了67 篇原创文章 · 获赞 0 · 访问量 1483

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/104645787
今日推荐