求动规大佬教我判重方法
  • 板块题目总版
  • 楼主KMSK
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/11/19 15:44
  • 上次更新2023/11/4 00:09:00
查看原帖
求动规大佬教我判重方法
472423
KMSK楼主2021/11/19 15:44

题目链接1433吃奶酪

怎样判断之前的点我已经走过了?

代码如下:(无判重40分)

#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
double ans=2147483647.0;
double dis[16][16];
struct point
{
    double x;
    double y;
}a[17];
double dp[17][17];//当前点的编号,此时加上这个点总共有几个点,存储的是最短的距离
void Initdis()
{
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            if(i==j)continue;
            dis[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
        }
    }
}
void Print()
{
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
          {
              cout<<dis[i][j]<<" ";
          }
          cout<<endl;
    }    
}
double Min(double xx,double yy)
{
    if(xx>yy)return yy;
    return xx;
}
int main()
{
    memset(dp,127,sizeof(dp));
   cin>>n;
   a[0].x=0.0;
   a[0].y=0.0;
   for(int i=1;i<=n;i++)
   {
       cin>>a[i].x>>a[i].y;
   }
   Initdis();
   //Print();
   for(int i=1;i<=n;i++)
   dp[i][2]=dis[i][0];//从(0,0)出发
    for(int i=1;i<=n;i++)//当前点编号
{
    for(int j=1;j<=n;j++)//上一个点
    {
        if(i==j)continue;
        for(int k=3;k<=n+1;k++)//当前共有几个点
        {
             dp[i][k]=Min(dp[j][k-1]+dis[i][j],dp[i][k]);
        }
    }
}
for(int i=1;i<=n;i++)
ans=Min(ans,dp[i][n+1]);
printf("%0.2lf",ans);
return 0;
}
2021/11/19 15:44
加载中...