洛谷 P1433 吃奶酪 状态压缩DP

该博客介绍了如何使用动态规划方法解决编程竞赛题目洛谷P1433——吃奶酪。博主首先给出了原题链接,并提供了C++代码实现,代码中计算了二维平面上各个点之间的距离,并通过动态规划更新点到原点的最短路径。最终求得所有点可达的最短总距离。
摘要由CSDN通过智能技术生成

练习动态规划中

本题参考博客:

P1433 吃奶酪 (状压dp)

洛谷 普及组 P1433 吃奶酪

原题链接:洛谷 P1433 吃奶酪

#include <bits/stdc++.h>
using namespace std;
double x[16],y[16],d[16][16],dp[16][40000];

double dis(int a,int b)
{
    return sqrt( (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]) );
}


int main()
{
    std::ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x[i]>>y[i];
    }
    memset(dp,127,sizeof(dp));//初始化点在各种状态下的距离
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
           d[i][j]=d[j][i]=dis(i,j);
        }
    }
    //第i点到(0,0)的距离,状态为1<<(i-1)
    for(int i=1;i<=n;i++)
    {
        dp[i][1<<(i-1)]=dis(0,i);
    }
    for(int r=1;r<=(1<<n)-1;r++)//遍历所有状态
    {
        for(int now=1;now<=n;now++)
        {
            if((r&(1<<(now-1)))==0)
                continue;//跳过未访问的点
            for(int pre=1;pre<=n;pre++)
            {
                if((r&(1<<(pre-1)))==0 ||now==pre)
                    continue;//如果pre不在当前状态已经走过的点当中或者now和pre是同一个点,就跳过
                dp[now][r]=min(dp[now][r],dp[pre][r-(1<<(now-1))]+d[now][pre]);
            }
        }
    }
    double res=1e8;
    for(int i=1;i<=n;i++)
    {
        res=min(dp[i][(1<<n)-1],res);
    }
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<res<<endl;

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值