day 33 状态压缩dp

news2025/8/2 21:31:56

二维状态压缩dp

对于解决哈密顿回路问题的状态压缩dp只能计算固定起点到其他点的总方案数最小路径

回路计数

小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼

(即走一条哈密尔顿回路)

可看做:从第一栋开始到 遍历完其他的所有方案数

状态压缩从第0位开始,因此在初始化邻接矩阵时要转换一下

#include <bits/stdc++.h>
using namespace std; 

long long a[22][22], dp[1 << 22][22], ans;
//dp[i][j]:i种状态,走到教学楼j的方案数 (数组稍微开大一点)
int main()
{
    for(int i = 1; i <= 21; i++)
        for(int j = 1; j <= 21; j++)
            if(__gcd(i, j) == 1) 
                a[i - 1][j - 1] = a[j - 1][i - 1] = 1;//从第0位开始 
    dp[1][0] = dp[0][1] = 1;//2楼到1楼 
    // 共2^21-1(即全1)种状态 
    for(int i = 1; i <= (1 << 21) - 1; i++){//考察状态i 
        for(int j = 0; j < 21; j++){//走到教学楼j 
            if(! (i >> j & 1)) continue; //如果状态i不经过教学楼j
            for(int k = 0; k < 21; k++){
                if((i >> k & 1) || ! a[j][k])continue;//如果状态i已经过k或者楼jk之间无路
                //从新状态i+1<<k,到楼k的方案数 = i到k + i到j到k 
                dp[i + (1 << k)][k] += dp[i][j]; 
            } 
        }
    }
    for(int i = 0; i < 21; i++)
        ans += dp[(1 << 21) - 1][i];//全1状态,最后一次经过i楼,然后最后回到1楼(因为1与所有数互质所以一定有路) 
    cout << ans << endl; 
    return 0;
}

吃奶酪

房间里放着 n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 (0,0) 点处。

固定起点(0, 0),遍历,最短路径

memset(a, 127, sizeof(a))

https://www.cnblogs.com/ljysy/p/12535388.html

https://blog.51cto.com/u_3044148/4005292

#include <bits/stdc++.h>
using namespace std;

double x[20], y[20], dp[20][(1 << 15) + 15];
int n;
double dis(int i,int j){
    return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
} 
int main()
{
    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++)//状态:在i点直接到j距离dp[i][j] 
            dp[i][j] = dp[j][i] = dis(i, j); 
    for(int i = 1; i < (1 << n); i++){//遍历所有状态 
        for(int j = 1; j <= n; j++){ 
            if(! (1 & (i >> (j - 1)))) continue;//不过第j块奶酪 
            //if(! (i & (1 << (j - 1)))) continue; //相当于上面 
            for(int k = 1; k <= n; k++){ 
                if(k == j || !(1 & (i >> (k - 1)))) continue;//与j同或该状态不过第k块 
                dp[j][i] = min(dp[j][i], dp[k][i - (1 << (j - 1))] + dis(j, k));//i-k-j 
            }     
        }
    } double ans = 1e9;
    for(int i = 1; i <= n; i++)
        ans = min(ans, dp[i][(1 << n) - 1] + dis(i, 0));//从(0,0)开始 
    printf("%.2lf\n", ans);
    return 0;
}

郊区春游

#include <bits/stdc++.h>
using namespace std; 

int n, m, r, vis[205], dis[205][205], edge[20][20], dp[205][(1 << 15) + 15]; 
int main()
{
    memset(dp, 127, sizeof(dp));
    cin >> n >> m >> r;
    for(int i = 1; i <= r; i++) cin >> vis[i];
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            dis[i][j] = 1e9;//从i到j最短距离初始化(无穷大:ij间没有路) 
    int a, b, c;
    for(int i = 0; i < m; i++){
        cin >> a >> b >> c;
        dis[a][b] = dis[b][a] = c;//有路
    }
    //floyd求i到j最短距离
    for(int k = 1; k <= n; k++){
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                if(dis[i][j] > dis[i][k] + dis[k][j])
                    dis[i][j] = dis[i][k] + dis[k][j];
            }
        }
    } 
    //把点转化为 1 2 3 4 ... r:问题变为从固定点走,经过每个点过一次距离最短多少?
    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= r; j++)
            edge[i][j] = dis[vis[i]][vis[j]];
    // tsp状态压缩dp
    for(int i = 1; i < (1 << r); i++){
        for(int j = 1; j <= r; j++){//状态为i时走到点j 
            if(!(i & (1 << (j - 1)))) continue;//状态i不过点j
            if(i == (1 << (j - 1))){ dp[j][i] = dp[i][j] = 0;continue;}//起点 
            for(int k = 1; k <= r; k++){//不过j,从k到j 
                if(dp[j][i] > dp[k][i - (1 << (j - 1))] + edge[j][k])
                    dp[j][i] = dp[k][i - (1 << (j - 1))] + edge[j][k];
            }
        } 
    }
    int ans = 1e9;
    for(int i = 1; i <= r; i++)
        ans = min(ans, dp[i][(1 << r) - 1]);
    cout << ans << endl; 
    return 0;
}

一维状态压缩dp

[蓝桥杯 2019 省 A] 糖果

总共m种糖果,状态有2^m - 1种情况

#include <bits/stdc++.h>
using namespace std; 

int n, m, k, tt, t, a[105], dp[1 << 20]; 
int main()
{
    cin >> n >> m >> k;
    memset(dp, -1, sizeof(dp)); //买不到全部则输出-1 
    for(int i = 0; i < n; i++){
        tt = 0;
        for(int j = 0; j < k; j++){
            cin >> t;
            tt = tt | (1 << (t - 1)); //二进制表示第i包糖果中有哪几种糖果 
        }
        a[i] = tt, dp[tt] = 1;//状态tt最少需1包 
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < (1 << m); j++){
            if(dp[j] == -1) continue;//没有该组合(状态)
            else if(dp[j | a[i]] == -1) dp[j | a[i]] = dp[j] + dp[a[i]];//新状态无记录 
            else dp[j | a[i]] = min(dp[j | a[i]], dp[j] + dp[a[i]]); //有记录,记录最小的 
        }
    }
    cout << dp[(1 << m) - 1] << endl;//输出买到所有糖果的最少包数 
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试题,用 Java 解【计算面积】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

索引的创建与设计原则

1.索引的声明与使用 1.1索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。按照 物理实现方式&#xff0c;索引可以分…

【编程基础之Python】6、Python基础知识

【编程基础之Python】6、Python基础知识Python基础知识Python的基本要素模块语句表达式注释Python的代码格式Python基础知识 Python 是一种高级的、动态的、解释型的编程语言&#xff0c;具有简单易学、开发效率高、可读性强等特点&#xff0c;广泛应用于数据科学、Web 开发、…

CRM系统能帮外贸行业解决哪些问题

国内的外贸行业经历了四个发展阶段&#xff0c;从发展期到繁荣期&#xff0c;CRM客户管理系统逐步走到幕前&#xff0c;成为外贸企业必不可少的主打工具。那么外贸行业整面临哪些问题&#xff1f;该如何解决&#xff1f;下面我们就来说说适合外贸行业的CRM解决方案。 外贸行业…

数据分享|2023年OSM道路数据(全国,分省,分市)

道路数据是我们在各项研究中经常使用的数据!道路数据虽然很常用,但是却基本没有能下载最近年份道路数据的网站,所以很多人不知道如何获到道路数据。 本次我们为大家推荐的下载道路数据的网站是Open Street Map!我们先来了解下Open Street Map,其简称为OSM,是一个开源的地…

整数保序的离散化(C/C++)

目录 1. 离散化的概念 1.1 离散化的运用思路 1.2 离散化的方法 1.2.1 排序 1.2.2 确定一个元素离散化后的结果 1.3 案例分析 1.3.1 1.3.2 区间和 &#xff08;来源&#xff1a;Acwing&#xff09; 1. 离散化的概念 离散化&#xff0c;把无限空间中有限的个体映射到有限的…

机房信息牌系统

产品特色&#xff1a; 无线低功耗安装简单&#xff0c;快速布置易于维护墨水屏显示&#xff0c;清晰&#xff0c;更环保信息后台推送&#xff0c;远程管理多模版样式随意制作多尺寸&#xff1a;4.2寸&#xff0c;7.5寸&#xff0c;10.2寸4.2寸7.5寸10.2寸标签特性&#xff1a;…

每日一个小技巧:教你如何使用终端工具给你的电脑发送弹窗提醒

现在人手一部智能手机&#xff0c;这些智能手机都有个非常实用的功能&#xff0c;那就是弹窗提醒。当我们收到短信&#xff0c;或者微信信息时&#xff0c;手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过重要信息了。 电脑上也有类似的功能&#xff0c;也很实用。…

改进YOLO系列 | 添加轻量化Decouple_Head 和 ASFF_Head

绿色为ASFF_Head,浅蓝色Decoupled_Head,深蓝色是第三步加的_initialize_dh_biases方法后的效果。 参数量与计算量对比 模型参数量 parameters计算量GFLOPsyolov5s_Head723538916.5ASFF_Head1267484725.0Decoupled_Head892869722.0结构图 本篇介绍的这个Decouple_Head和YOLOX…

亚马逊、temu、速卖通、eBay如何提高店铺的订单数量?有什么技巧?

亚马逊卖家店铺的排名与店铺的订单数量有很大关系&#xff0c;所以卖家必须尝试改善店铺的销售。如果找不到正确的方法&#xff0c;订单速度很慢&#xff0c;卖家应该如何提高店铺的订单数量&#xff1f; 一、选择价格低、流量大的产品 无论是精细操作还是配送模式操作&…

代码随想录 NO51 | 动态规划_leetcode583. 两个字符串的删除操作 72. 编辑距离

动态规划_leetcode583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结动态规划快结束了&#xff0c;时间过的好快啊&#xff0c;今天编辑距离系列结束&#xff01; 583. 两个字符串的删除操作 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的…

python使用requests提交post请求并上传文件(multipart/form-data)

目录 一、背景 二、请求接口上传文件 2.1、分析接口 2.2、python进行请求 三、总结 一、背景 也是前几天&#xff0c;有一个需求上传文件需要自动化。具体是上传到系统一个文件&#xff0c;并收到返回结果。考虑使用python的requests&#xff0c;一般这种查询或上传文件的接…

DMotion - 基于DOTS的动画框架和状态机

【博物纳新】专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目&#xff0c;帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果&#xff0c;并探索将其应用到自己项目的可行性。很多时候&#xff0c;我们并不知道自己想要什么&#xff0c;直到某…

Android反射@hide API 方法、变量,支持Android11和Android12

Android源码中现在有大量的方法和变量被hide所修饰&#xff0c;而这些被hide修饰的方法和变量是不允许应用层进行反射获取的&#xff0c;所以富有探索精神的程序员们就开始想尽各种办法绕过系统hide限制来使用hide修饰的方法和变量。1、套娃&#xff08;适配Android10即之前&am…

Python实现贝叶斯优化器(Bayes_opt)优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是基…

PHPExcel 表格设置

4.5.3。通过行和列设置单元格值 通过设置坐标单元格值可以使用工作表的setCellValueByColumnAndRow方法来实现。 //设置单元格B8 $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, 8, ‘Some value’); 4.5.4。由列和行中检索的小区 检索的小区的值&#…

Blender——竹篮的制作

效果图前言参考视频&#xff1a;Blender 竹篮建模编制效果3D教程建议Blender版本在v3.0.0或以上&#xff0c;本实验的blender为v3.4.1操作步骤打开一个【常规项目】。点击shading下拉列表&#xff0c;将颜色改为【随机】&#xff0c;背景改为【世界坐标】&#xff0c;勾选【Cva…

Linux期末考试应急

Linux期末考试应急 虚拟机添加硬盘、分区、格式化、挂载、卸载 fdisk -l#查看系统现有分区fdisk <指定磁盘>#指定磁盘分区sudo mkfs.ext3 <指定分区>#格式化磁盘###挂载磁盘1.新建一个目录sudo mkdir /mnt/test2.将指定分区挂载到对应目录sudo mount /dev/sdb10 /…

里程计(一) 数学模型及STM32实现

一、首先确保接线和硬件没问题&#xff0c;并确定控制逻辑 测试单片机-驱动板-电机连线是否接通&#xff1a;控制板IN1,IN2一个接3.3V一个接GND,ENA1接3.3V测左电机&#xff1b;控制板IN3,IN4一个接3.3V一个接GND,ENA2接3.3V测右电机。 在电机已经安装完毕的情况下&#xff0c;…

SAP ABAP中的数据类型 Data Types

简单来说分两种&#xff1a; 数据字典里定义的在ABAP程序里定义的 文章目录1. ABAP数据字典里的1.1 数字型的1.2 字符型1.3 字节型1.4 特殊类型2. 预定义的ABAP数据类型2.1 预定义数字型2.2 预定义字符型2.3 预定义字节型1. ABAP数据字典里的 1.1 数字型的 用在数学计算里的…