2024蓝桥杯每日一题(状压DP)

news2024/11/18 18:31:38

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:毕业旅行问题
        试题二:蒙德里安的梦想
        试题三:最短Hamilton路径
        试题四:国际象棋


试题一:毕业旅行问题

【题目描述】

        小明目前在做一份毕业旅行的规划。打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。由于经费有限,小明希望能够通过合理的路线安排尽可能的省些路上的花销。给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销。

        注意:北京为 1 号城市。

【输入格式】

        第一行包含一个正整数 n,表示城市个数。

        接下来输入一个 n 行 n 列的矩阵,表示城市间的车票价钱。

【输出格式】

输出一个整数,表示最小车费花销。

【数据范围】

        1<n≤20,包括北京
        车票价格均不超过 1000元。

【输入样例】

4
0 2 6 5
2 0 4 4
6 4 0 2
5 4 2 0

【输出样例】

13

【解题思路】

        比较标准的状态压缩问题,可以看成固定起点的一个最短哈密顿路径问题,不过要加上最后一个点到北京的距离,所以在初始化时可以令f[1<<i][i]  = m[0][i],然后求最短哈密顿距离,不过得提前判断一下状态st,如果st第0位是1同时st!=(1<<n)-1那么当前状态无效,跳过。最后的答案是f[(1<<n)-1][0]。转移方程为:f[st][i] = min(f[st][i] , f[st - (1<<i)][j] + m[j][i])

【Python程序代码】

n = int(input())
m = []
for i in range(n):
    m.append(list(map(int,input().split())))
inf,fin = 1e9,1<<n
f = [[int(1e9)]*(n+5) for _ in range((1<<n)+10)]
for i in range(1,n):f[1<<i][i]=m[0][i]
for st in range(fin):
    if st&1 and st!=fin-1:continue
    for i in range(n):
        if (1<<i) & st:
            for j in range(n):
                if  (st-(1<<i)) & (1<<j):
                    f[st][i] = min(f[st][i],f[st-(1<<i)][j] + m[j][i])
print(f[fin-1][0])

试题二: 蒙德里安的梦想

【题目描述】

        求把 N×M 的棋盘分割成若干个 1×2的长方形,有多少种方案。例如当 N=2,M=4时,共有 5种方案。当 N=2,M=3时,共有 3 种方案。
        如下图所示:

【输入格式】

        输入包含多组测试用例。

        每组测试用例占一行,包含两个整数 N 和 M。

        当输入用例 N=0,M=0 时,表示输入终止,且该用例无需处理。

【输出格式】

        每个测试用例输出一个结果,每个结果占一行。

【数据范围】

        1≤N,M≤11

【输入样例】

1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0

【输出样例】

1
0
1
2
3
5
144
51205

【解题思路】

        定义状态fij,表示前i-1列已经排好,且第i列的状态为j的方案数,所以转移方程应该为f[i][j] +=  f[i-1][k],k的状态应该为首先相邻的零的数量是偶数,同时其与j的或也是一个合法的状态即相邻的零的数量是偶数,同时二者的与应该为0。为了加快效率,可以预处理出所有的合法的列的状压,也预处理出每一个合法的列能够邻接的合法状态。

【Python程序代码】

n,m = map(int,input().split())
while n and m:
    fin = 1<<n
    f = [[0]*(fin+10) for _ in range(m+10)] # fij表示前i-1列已经铺好,第i列状态为j的方案数
    st = [0]*(fin+10)
    state = [[] for _ in range(fin+10)]
    for i in range(fin):
        cnt = 0
        flag = 0
        for j in range(n):
            if i & (1<<j):
                if cnt%2:
                    flag=1
                    break
            else:
                cnt +=1
        if cnt%2:flag=1
        if not flag:st[i]=1
    for i in range(fin):
        for j in range(fin):
            if i&j==0 and st[i|j]:
                state[i].append(j)
    f[0][0]=1
    for i in range(1,m+1):
        for j in range(fin):
            for k in state[j]:
                f[i][j] += f[i-1][k]
    print(f[m][0])
    n,m = map(int,input().split())

试题三:最短Hamilton路径

【题目描述】

        给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。

【输入格式】

        第一行输入整数 n。

        接下来 n 行每行 n 个整数,其中第 i 行第 j 个整数表示点 i到 j 的距离(记为 a[i,j])。

        对于任意的 x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x]=0 且 a[x,y]+a[y,z]≥a[x,z]。

【输出格式】

        ·输出一个整数,表示最短 Hamilton 路径的长度。

【数据范围】

        1≤n≤20
        0≤a[i,j]≤107

【解题思路】

        第一题的缩减版,初态f[1][0]=0,也就是在初始点的值为0,其他的参考第一题。

【Python程序代码】

n = int(input())
a = []
for i in range(n):
    a.append(list(map(int,input().split())))
inf = int(1e9)
f = [[inf]*(n+5) for _ in range((1<<n)+10)]
f[1][0]=0
fin = 1<<n
for st in range(fin):
    for i in range(n):
        if st&(1<<i):
            for j in range(n):
                if (st-(1<<i)) & 1<<j:
                    f[st][i] = min(f[st][i],f[st-(1<<i)][j] + a[j][i])
print(f[fin-1][n-1])

第四题:国际象棋

        众所周知,“八皇后” 问题是求解在国际象棋棋盘上摆放 8 个皇后,使得两两之间互不攻击的方案数。已经学习了很多算法的小蓝觉得 “八皇后” 问题太简单了,意犹未尽。作为一个国际象棋迷,他想研究在 N×M的棋盘上,摆放 K 个马,使得两两之间互不攻击有多少种摆放方案。由于方案数可能很大,只需计算答案除以 1000000007 (即 109+7) 的余数。

        如下图所示,国际象棋中的马摆放在棋盘的方格内,走 “日” 字,位于 (x,y) 格的马(第 x 行第 y 列)可以攻击 (x+1,y+2)、(x+1,y−2)、(x−1,y+2)、(x−1,y−2)、(x+2,y+1)、(x+2,y−1)、(x−2,y+1)和 (x−2,y−1) 共 8 个格子。

【输入格式】

        输入一行包含三个正整数 N,M,K分别表示棋盘的行数、列数和马的个数。

【输出格式】

        输出一个整数,表示摆放的方案数除以 1000000007 (即 109+7) 的余数。

【数据范围】

【输入样例】

4 4 3

【输出样例】

276

【解题思路】

        定义状态f[i][a][b][j]表示前i列已近防止好了j个马,第i列状态为b,第i-1列状态为a,所以状态转移方程应该为:f[i][a][b][j] = (f[i][a][b][j] + f[i-1][c][a][k]),首先相邻的状态a,b之间需要判断是否合法即判断:a&(b<<2) or b&(a<<2),后面再枚举c的状态,也需要判断c与a和c与b之间是否合法。然后枚举马的数量,应该为k应该是小于b状态的1的数量的数,同时需要保证总的马的数量不超过1.

【Python程序代码】

n,m,k = map(int,input().split())
fin,p = 1<<n,10**9+7
f = [[[[0]*(22) for _ in range(fin+5)] for i in range(fin+5)] for j in range(110)]
# f i a b j += f i-1 c a j-cnt1(b)
def get1(x):
    cnt = 0
    while x:
        cnt += x%2
        x//=2
    return cnt
f[0][0][0][0]=1
for i in range(1,m+1):
    for a in range(fin):
        for b in range(fin):
            if a&(b<<2) or b&(a<<2):continue
            for c in range(fin):
                if a&(c<<2) or c&(a<<2):continue
                if c&(b<<1) or b&(c<<1):continue
                t = get1(b)
                for j in range(t,k+1):
                    f[i][a][b][j] = (f[i][a][b][j] + f[i-1][c][a][j-t])%p

res = 0
for a in range(fin):
    for b in range(fin):
        res =  (res + f[m][a][b][k])%p
print(res)

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

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

相关文章

集合系列(十六) -集合知识回顾整理

一、摘要 在 Java 中&#xff0c;集合大致可以分为两大体系&#xff0c;一个是 Collection&#xff0c;另一个是 Map&#xff0c;都位于java.util包下。 Collection &#xff1a;主要由 List、Set、Queue 接口组成&#xff0c;List 代表有序、重复的集合&#xff1b;其中 Set…

一文读懂Cache一致性原理

1. 为何需要cache一致性 访问memory数据的速度相比core的运行速度来说&#xff0c;要花费更多的时钟周期&#xff0c;为了减轻这个差异引进了存储器层次结构&#xff0c;如图1所示。在层次结构中&#xff0c;越往上&#xff0c;读写速度越快&#xff0c;价格更贵&#xff0c;存…

Prometheus(六):Blackbox监控安装配置

目录 1 Blackbox Exporter安装配置1.1 Blackbox Exporter简介1.2 安装1、安装-使用源码包安装下载安装blackbox.yml文件配置快速启动文件 2、安装-使用docker 1.3 Prometheus配置1、http监控2、ping探测-ip3、https probe-DNS解析4、metrics配置5、TCP监控-探测端口 总结 1 Bla…

Element UI中日期选择日(date-picker)等其他选择器下拉显示错位、位置错误解决

省流版 给选择器加上唯一key&#xff08;下面的想看就看&#xff09; 问题复现 需求是用一个下拉切换时间维度的选择&#xff0c;分别为年度、季度、月度&#xff0c;但是开发的时候发现&#xff0c;当切换的时候&#xff0c;视图可正常切换&#xff0c;但点击选择时却发现选…

InfoNCE loss

InfoNCE loss是一种用于自监督学习的损失函数&#xff0c;通常用于训练对比学习模型&#xff0c;如自编码器或神经网络。全称是"InfoNCE: Contrastive Estimation of Neural Entropy"&#xff0c;基于对比学习的思想&#xff0c;旨在最大化正样本的相似性&#xff0c…

关于 C/C++ 1Z(17)开源项目 openppp2 协同程式切换工作流

下述为开源项目 openppp2&#xff08;github&#xff09;构建工作在 C/C 17 的 stackful 有栈协同程式的工作流切换示意图&#xff1a; 在 openppp2 之中采用人工手动方式管理协同程式之间的切换&#xff0c;每个中断过程只是保存线程栈信息&#xff08;如寄存器、当前#PC EIP&…

利用idea创建一个maven web工程

1.创建Maven项目 2.选择不使用Web项目骨架&#xff08;即普通maven项目&#xff09; 3.创建成功后在pom.xml设置打包方式为war&#xff0c;并重构maven项目 <packaging>war</packaging> 4.补齐Maven Web项目缺失webapp的目录结构 右键项目名打开模块设置&#xf…

【STM32+HAL】I2C+DMA读取AS5600编码器

一、DMA的应用 有关更多DMA的应用&#xff0c;详见【STM32HAL】DMA应用 二、HAL库配置 1、开启I2C 开启对应DMA及中断 2、开启串口通信 至此&#xff0c;HAL库配置完毕 三、DMA版&#xff08;高效但不稳定&#xff09; 1、as5600.c #include "AS5600.h" #includ…

Javascript本地存储的方式,区别及应用场景

文章目录 一、方式cookielocalStorage特点sessionStorage扩展的前端存储方式优点&#xff1a;缺点&#xff1a; 二、区别三、应用场景相关连接 一、方式 javaScript本地缓存的方法我们主要讲述以下四种&#xff1a; cookiesessionStoragelocalStorageindexedDB cookie Cook…

【Python】python编程初探2---字符编码,输入和输出,初识数据类型

欢迎来CILMY23的博客 本篇主题为【Python】python编程初探2---字符编码&#xff0c;输入和输出&#xff0c;初识数据类型 个人主页&#xff1a;CILMY23-CSDN博客 Python系列专栏&#xff1a;​​​​​​​http://t.csdnimg.cn/rAsEH 上一篇博客&#xff1a;http://t.csdni…

网络层协议之IP协议

网络层主要做两方面事情&#xff1a; 1.地址管理&#xff1a;制定一系列规则&#xff0c;通过地址描述出网络上的一个设备的位置 2.路由选择&#xff1a;网络环境复杂&#xff0c;从一个节点到另一个节点之间有很多条路径&#xff0c;这就需要通过路由选择来筛选/规划出更合适…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

数据库与缓存一致性如何保证

最近建了一个技术交流群&#xff0c;欢迎志同道合的同学加入&#xff0c;群里主要讨论&#xff1a;分享业务解决方案、深度分析面试题并解答工作中遇到的问题&#xff0c;同时也能为我提供写作的素材。 欢迎加Q&#xff1a;312519302&#xff0c;进群讨论 前言 在工作中&#…

LangChain使用实例——RAG

Q&A with RAG Overview LLMs支持的最强大的应用程序之一是复杂的问答 (Q&A) 聊天机器人&#xff0c;这些应用程序可以回答有关特定源信息的问题&#xff0c;使用一种称为检索增强生成&#xff08;RAG&#xff09;的技术。 RAG RAG 是一种利用额外数据增强 LLM 知识…

linux 网卡配置 vlan/bond/bridge/macvlan/ipvlan 模式

linux 网卡模式 linux网卡支持非vlan模式、vlan模式、bond模式、bridge模式&#xff0c;macvlan模式、ipvlan模式等&#xff0c;下面介绍交换机端及服务器端配置示例。 前置要求&#xff1a; 准备一台物理交换机&#xff0c;以 H3C S5130 三层交换机为例准备一台物理服务器&…

如何用智能AI绘一幅世界地图?

今天我们分享一下&#xff0c;用智能AI绘一幅世界地图的方法&#xff01; 为了方便你极速体验&#xff0c;特意在文末为你准备了登录帐号&#xff0c;省去你注册的烦恼。 认准AI绘画官网 如果你在百度搜索“AI绘画”或“Midjourney”&#xff0c;找出来的基本全是广告&#…

matplotlib画图:子图中坐标轴与标题重合...

如下图 只要在代码最后加入 plt.tight_layout() 就可以自动调节

Java练习题目6:水仙花数是指其个位,十位和百位三个数字的立方和等于其自身的三位数,求出所有的水仙花数。(Daddodil6)

每日小语 要相信卷首以卷尾为前提&#xff0c;几乎同卷尾以卷首为前提是一样的。——叔本华 思考 //水仙花数是指其个位&#xff0c;十位和百位三个数字的立方和等于其自身的三位数&#xff0c;求出所有的水仙花数。 import java.util.Scanner; public class Daddodil6 {publ…

服务运营 | 印第安纳大学翟成成:改变生活的水井选址

编者按&#xff1a; 作者于2023年4月在“Production and Operations Management”上发表的“Improving drinking water access and equity in rural Sub-Saharan Africa”探讨了欠发达地区水资源供应中的可达性和公平性问题。作者于2020年1月去往非洲埃塞俄比亚提格雷地区进行…

【Python进阶】:面向对象编程的力量:解锁封装、继承与多态的秘密武器

引言 在Python编程世界中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;如同一把锋利的剑&#xff0c;它将现实世界的实体抽象为类&#xff0c;赋予程序更强的结构化、模块化特征&#xff0c;极大地提升了代码的可读性、可维护性和复用性…