一道状压DP模板求助
  • 板块P1433 吃奶酪
  • 楼主conprour
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/5/15 21:14
  • 上次更新2023/11/4 23:13:04
查看原帖
一道状压DP模板求助
234783
conprour楼主2021/5/15 21:14

RT,求帮忙看看,大致思路注释了,样例没过

#include<bits/stdc++.h>
using namespace std;
#define db double
const int INF = 0x3f3f3f3f;
int n;
db dp[1<<20][20],x[20],y[20];
db dis(int a,int b) {return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));}
void checkmin(db &x,db y)
{
    if(x==-1||x>y)
        x=y;
}
int main()
{

    scanf("%d",&n);
      for(int i=1;i<=n;i++) 
        scanf("%lf%lf",&x[i],&y[i]);
    memset(dp,0x3f,sizeof(dp));
    for(int i=1;i<=n;i++)   
        dp[1<<(i-1)][i]=dis(0,i);
   		dp[0][0]=dp[1][0]=0;
    for(int mask=1;mask<(1<<n) ;mask++)//当前状态 
        for(int end=1;end<=n;end++)//上一次从哪个点转移来 
            if(dp[mask][end]!=INF) 
            {
            //  if(mask&(1<<(end-1))==0) continue;
                for(int nxt=1;nxt<=n;nxt++)//下一个状态是什么 
                {
                    if(end==nxt) continue;
                    if(! (mask&(1<<(nxt-1))) )
                    {
                        checkmin(dp[mask|(1<<(nxt-1))][nxt],dp[mask][end]+dis(end,nxt));

                    }
                }
            }
    db ans=-1;
    for(int end=1;end<=n;end++)
    {
    //  printf("%lf ",dp[(1<<n)-1][end]);
        if(dp[(1<<n)-1][end]!=INF)
        checkmin(ans,dp[(1<<n)-1][end]+dis(end,0));
    }
    printf("%.2lf",ans);
    return 0;
}
2021/5/15 21:14
加载中...