首页 > 其他分享 >状压dp刷题记录【持续更新】

状压dp刷题记录【持续更新】

时间:2022-10-09 12:44:59浏览次数:74  
标签:状态 int double 状压 maxn include dp 刷题

前言:

许多算法的状态数并不支持其在多项式时间内运行完成。比如TSP问题这种大部分为NP-Hard的问题。

在数据范围缩小的前提下(例如\(n\leq 21\)),不妨将状态数压缩成二进制情况,用一串二进制数表示整体情况。

洛谷 P1433

记\(dp_{k,i}\)为:当前整体状态为\(k\),老鼠走到了第\(i\)个奶酪的最短距离。

其中\(k\)是一串二进制数字,例如01011010表示经过了第2、4、5、7个奶酪(从右往左计数)。

易得状态转移方程为:

\[dp_{k,i}=min\{dp_{k-[1<<(i-1)],j}+dis(j,i)\}(1\leq i,j\leq n) \]

其中:
1<<(i-1)表示第\(i\)位状态,
k-[1<<(i-1)表示没有经过第\(i\)位时的整体状态,
dp_{k-[1<<(i-1)], j} 表示在第\(j\)个点且没有经过第\(i\)位的最短距离。

最后对以每个点为结尾的满状态(n个点均经过)dp方程取最小值即可。

注:注意位运算优先级,debug了很久才发现

Code:

点击查看代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>

const int maxn = 15 + 5;
double dis[maxn][maxn];//i到j的距离
double dp[40000][maxn];//二进制状态为i,目前在第j个奶酪处
double ans = 114514.0, x[maxn], y[maxn];
int n;

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

int main() {
    scanf("%d", &n);
    memset(dp, 127, sizeof(dp));
    for (int i = 1; i <= n; i++)
        scanf("%lf%lf", &x[i], &y[i]);
    for (int i = 0; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            dis[i][j] = dis[j][i] = d(i, j);
        }
    }

    for (int i = 1; i <= n; i++)
        dp[1 << (i - 1)][i] = dis[i][0];//初始化第i个点的距离即为与原点的距离

    for (int k = 1; k < (1 << n); k++)//枚举每种状态
        for (int i = 1; i <= n; i++) {
            if ((k & (1 << (i - 1))) == 0) continue;//第i位为0
            for (int j = 1; j <= n; j++) {
                if (i == j) continue;
                if ((k & (1 << (j - 1))) == 0) continue;//第j位为0
                dp[k][i] = std::min(dp[k][i], dp[k - (1 << (i - 1))][j] + dis[j][i]);
            }
        }
    for (int i = 1; i <= n; i++)
        ans = std::min(ans, dp[(1 << n) - 1][i]);//更新以第i个奶酪为结尾的n个满状态答案
    printf("%.2lf", ans);
    return 0;
}

标签:状态,int,double,状压,maxn,include,dp,刷题
From: https://www.cnblogs.com/MrWangnacl/p/16771743.html

相关文章

  • TCP与UDP的联系与区别
     TCP和UDP是TCP/IP体系中运输层的两个协议。 TCP是传输控制协议,旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机通信网络的主计算机中的成对进......
  • TCP与UDP的联系与区别
    TCP与UDP是什么?TCP协议和UDP协议都是属于TCP/IP协议簇中的协议,且都是传输层中的协议。 TCP协议TCP协议是面向连接的协议。TCP传输有三个步骤:建立连接、传输数据、关闭......
  • TCP和UDP的区别
    两种协议的简单介绍TCP:传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议;UDP:用户数据报协议(UDP,UserDatagramProtoc......
  • TCP和UDP的联系与区别
         在TCP/IP体系中,运输层有两个协议:TCP和UDP。    UDP——用户数据报协议是TCP/IP协议体系中运输层协议之一,UDP协议只提供应用进程寻址和简单的差错......
  • 浅析TCP与UDP的联系与区别?
    什么是TCP?传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的特点:(1)TCP是面向连接的运输层协议。......
  • UDP和TCP的联系和区别
    1.tcp和udp的概念TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。在简化的计算机网络OSI模型......
  • TCP与UDP的联系与区别
    TCP与UDP基本区别:1、基于连接与无连接。2、TCP要求系统资源较多,UDP较少。3、UDP程序结构较简单。4、流模式(TCP)与数据报模式(UDP)。5、TCP保证数据正确性,UDP可能丢包。6、TC......
  • TCP与UDP的联系与区别
    TCP与UDP基本区别:1、基于连接与无连接。2、TCP要求系统资源较多,UDP较少。3、UDP程序结构较简单。4、流模式(TCP)与数据报模式(UDP)。5、TCP保证数据正确性,UDP可能丢包。6、TC......
  • TCP与UDP的联系与区别?
    TCP(TransmissionControlProtocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来:1)主机A......
  • tcp与udp的区别
    TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接TCP要求的系统资源较多,UDP较少TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差......