uva 1347 - Tour(이중 유클리드)

2420 단어 점차 미루다
제목 대의: n개의 점을 제시하여 각 점을 연결하는 가장 짧은 폐합 여정을 확정하는 문제.
문제풀이 사고방식: dp[i][j]는 i에서 1로, 그리고 1에서 j까지의 거리를 나타낸다.
dp[i][j] = dp[i-1][j] + dis(i,i-1);
dp[i][i-1] = min (dp[i][i-1], dp[i-1][j] + dis(i, j));
기억 코드:
//0 KB 58 ms
#include
#include
#include
#include
#include
using namespace std;
int n;
double dis[1010][1010];
pairpoint[1010];
double dp[1010][1010];
double dist(int x,int y)
{
    return sqrt((point[x].first-point[y].first)*(point[x].first-point[y].first)+(point[x].second-point[y].second)*(point[x].second-point[y].second));
}
double getdp(int x,int y)
{
    double &ans=dp[x][y];
    if(ans>=0) return ans;
    if(x==n-1){
        ans=dis[n-1][n]+dis[y][n];
        return ans;
    }
    ans=min(getdp(x+1,y)+dis[x][x+1],getdp(x+1,x)+dis[y][x+1]);
    return ans;
}
int main()
{
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&point[i].first,&point[i].second);
          //  printf("%f %f",point[i].first,point[i].second);
            for(int j=1;j<=i-1;j++){
                dis[i][j]=dis[j][i]=dist(i,j);
            }
        }
        memset(dp,-1,sizeof(dp));
        printf("%.2f
",getdp(1,1)); } return 0; }

반복:
//0 KB 12 ms
#include
#include
#include
#include
#include
using namespace std;
int n;
double dis[1010][1010];
pairpoint[1010];
double dp[1010][1010];
double dist(int x,int y)
{
    return sqrt((point[x].first-point[y].first)*(point[x].first-point[y].first)+(point[x].second-point[y].second)*(point[x].second-point[y].second));
}
int main()
{
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&point[i].first,&point[i].second);
            for(int j=1;j<=i-1;j++){
                dis[i][j]=dis[j][i]=dist(i,j);
            }
        }
        for(int i=1;i=1;i--)
        for(int j=1;j<=i;j++){
            if(j==i&&i!=1) break;
            dp[i][j]=min(dp[i+1][j]+dis[i][i+1],dp[i+1][i]+dis[j][i+1]);
        }
        printf("%.2f
",dp[1][1]); } return 0; }

좋은 웹페이지 즐겨찾기