当前位置: 首页 > news >正文

算法第十七期——状态规划(DP)之动态压缩

 一、总述

        状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式。

  • 应用背景:以集合为状态,且集合可以用二进制来表示,用二进制的位运算来处理。
  • 集合问题一般是指数复杂度的,例如:(1)子集问题,设元素无先后关系,那么共有2^n个子集;(2)排列问题,对所有元素进行全排列,共有n!个全排列。
  • 状态压缩DP:集合的状态(子集或排列),如果用二进制表示状态,并用二进制的位运算来遍历和操作,又简单又快。
  • 题目的数据范围不超过100

很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用。

状压dp其实就是将状态压缩成2进制来保存,其特征就是看起来有点像搜索,每个格子的状态只有1或0 ,是另一类非常典型的动态规划

举个例子:有一个大小为n*n的农田,我们可以在任意处种田,现在来描述一下某一行的某种状态:

设n = 9;有二进制数 100011011(九位),每一位表示该农田是否被占用,1表示用了,0表示没用,这样一种状态就被我们表示出来了:见下表

2、位运算

用位运算做集合操作
判断a的第i位(从最低位开始数)是否等于1:         1<<( i -1 ) ) & a
把a的第i位改成1:                                                       a | ( 1<<(i-1) )

把a的第i位改成0:                                                       a &(~(1<<i) )

把a的最后一个1去掉:                                                 a& (a-1)                                   

a = 213;b = 45           # a = 1101 0101,b = 0010 1101
print("a & b =", a & b)  # AND = 5,二进制0001 0101 
print("a | b =",a | b)   # OR= 253,二进制1111 1101
print("a^ b =",a^ b)     # XOR= 248,二进制1100 1100
print("a << 2 =", a<< 2) # a*4= 852,二进制0011 0101 0100
print("a >> 2=", a >> 2) # a/4 = 53,二进制0011 0101i = 5                    # a的第i位是否为1
if((1 << (i-1)) & a): print("a[%d]=%d"%(i,1));#a的第i位是1
else:                 print("a[%d]=%d"%(i,O));#a的第i位是0a = 43;i = 5  #a = 0010 1011
print("a=", a |(1<<(i-1)))    # 把a的第i位改成1。a=59,二进制0011 1011
print("a=", a &(~(1<<(i-1)))) # 把a的第i位改成0a = 242                       # 把a最后的1去掉。      a =1111 0010
print("a=", a & (a-1))        # 去掉最后的1。=240,二进制1111 0000

3、引导题:糖果

2019年省赛 

题目描述

糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种口味编号 1∼ M。

小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是 K 颗一包整包出售。幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。

输入描述

第一行包含三个整数 N,M,K。

接下来 N 行每行 K 个整数 T1​,T2​,⋅⋅⋅,TK​,代表一包糖果的口味。

其中,对于30%的评测用例,1<N<20。对于所有评测样例,1<N<100,1≤M<20,1K <20,1≤Ti≤M。)

输出描述

输出一个整数表示答案。如果小明无法品尝所有口味,输出 −1。

输入输出样例

输入

6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2

输出

2

暴力法

  • 对n包糖果做任意组合,找到其中一种组合,能覆盖所有口味,并且需要的糖果包数量最少
  • n包糖果的组合共有2^n种,暴力法只能通过30%的测试。
  • 再用set()对每一种组合进行去重,看看那种组合能否覆盖所有口味。

DP 

(1)定义状态dp[i]:表示得到口味组合 i(有i种口味) 所需要的最少糖果包数量。(当i=M就是答案)
(2)状态转移。往口味组合i中加入一包糖果,得到新的口味组合j,说明从i到j需要糖果包数量dp[i]+1。若原来的dp[j]大于dp[i]+1,说明原来得到j的方法不如现在的方法,更新dp[j] = dp[i]+1

关键问题:如何表示口味组合。

1、普通方法:为每一包糖果定义一个大小为m的数组(以表示m种口味),记录它的口味。n包糖果的口味是一个n*m的二维数组,定义为kw[n][m]

  • 例:设共有m=10种口味,kw[1][ ] ={0,0,0,0,0,1,0,1,1,0},表示第一包糖果的口味有三种。

2、状态压缩记录一包糖果的口味,用二进制数表示。

  • 例:一包里面有3颗糖果,分别是“2,3,5”三种口味,用一个二进制数“10110”表示,这个二进制数的每一位表示一种口味。
  • 使用状态压缩之后,原来需要用二维数组kw[n][m]才能表示n包糖果的口味,现在只需要一个一维数组kw[n]
  • 例如kw[1] = 10110,表示第一包的口味是“2,3,5”三种。
  • 状态压缩DP的代码写起来很简洁,因为可以用位运算来简化代码。

1、用状态压缩表示糖果口味

例:输入一包糖果的“2,3,5”三种口味。
把这3个口味压缩成二进制数10110,做“移位 << ”和“或 ”操作。

  • (1)定义初始值tmp = 0。(初始口味为0)
  • (2)输入口味“2”。

        先移位1<<(2-1),得二进制数10;然后再与tmp或,得tmp = tmp | 10 = 10。

  • (3)输入口味“3”。

        先移位1<<(3-1),得二进制数100;然后再与tmp或,得tmp = tmp | 100 = 110。

  • (4)输入口味“5”。

        先移位1<<(5-1),得二进制数10000;然后再与tmp或,得tmp = tmp | 10000 = 10110。

代码:tmp |= (1<<x-1)

2、dp[ ]中状态压缩的处理

dp[i]:i 表示口味,用状态压缩表示;  dp[i]表示得到口味i的最少糖果包数量。
状态转移:同样用到二进制的“”操作。例如tmp表示某一包的糖果口味,那么dp[i | tmp]就表示得到口味 i | tmp所需要的最少糖果包数量。

代码:

n, m, k = map (int,input (). split())
tot = (1 <<m)-1                                    # tot:二进制是m个1,表示所有m种口味
dp = [-1 for _ in range(1 << 20)]                  # 初始化为-1,因为无解时输出-1
dp[0] = 0                                          # 初始化为0,代表0包糖果有0种口味
kw = []                        
for _ in range (n):kw.append([int(i) for i in input ().split()])  # kw是二维矩阵
for c in kw:            # 按行遍历每包糖果tmp = 0for x in c: tmp |= (1 <<(x-1)) # 遍历这包糖果的口味for i in range(tot+1):         # 遍历所有组合if (dp[i] == -1): continue # 不存在得到口味i的最少糖果包数量newcase = i | tmp  # 加上新的一包后的新的口味组合if (dp[newcase] == -1) or (dp[newcase] > dp[i] +1): # 新的口味之前没算过或者包数比之前多dp[newcase] = dp[i] +1
print(dp[tot])        # 得到所有口味tot的最少糖果包数量

第二行代码解释:例如m=5,(1<<m)=100000 ,那么(1<<m)-1 = 11111,表示五种口味。

复杂度:for循环,tot=2m;for循环n次,总复杂度O(n2m),本题n=100,m=20,n2^m约为一亿次。

例题:矩阵计数

题目描述

一个 N×M 的方格矩阵,每一个方格中包含一个字符 O 或者字符 X。

要求矩阵中不存在连续一行 3 个 X 或者连续一列 3 个 X

问这样的矩阵一共有多少种?

输入描述

输入一行包含两个整数 N,M (1≤N,M≤5)。

输出描述

输出一个整数代表答案。

输入输出样例

输入

2 3

输出

49

思路: 

  • 很直接的状态压缩DP。
  • 把方格中的字符‘0’看成数字0,字符‘X’看成数字1。
  • 每一行看成一个m位的二进制数,例如一行字符“OOXOX”对应二进制数“00101”。
  • 一行数字有2^m种情况,即范围[0,1<<m)内的数字。这些数字里面只有部分数字符合要求,把这些数存进一个数组 row[ ]。
  • 要求:这个数字中没有连续的3个1。一个符合要求的数就是这一行的一个合法状态。

做法

  • 定义状态dp[i][i][k]:第i行的合法状态为j,前一行的合法状态为k时,符合条件的矩阵有多少个。(处理比较连续三行的定义方法)
  • 连续3行的情况:设第i行状态为j,前一行状态为k,再前面一行状态为p,那么j & k& p等于0,说明这3行没有一列上是3个1。这3行是一种合法状态。
  • 状态的递推:

                        if j & k & p==0:
                                dp[i][i][k] += dp[i- 1][k][p]

代码 

check (x) :
检查一行(用x表示这一行)里面有没有连续的3个1 

dp[ ][ ][ ]:定义三维的dp
dp[i][][k]:第i行的合法状态为j,前一行的合法状态为k时,符合条件的矩阵有多少个

def check(x):     #检查x中有没有连续3个1num = 0while x:if x & 1:num += 1           # 从第一位开始,发现一个1else:num = 0                # 没有1则重置为0if num == 3: return False   # 有连续3个1x >>= 1                     #右移一次return True                   # 没有连续三个1,满足要求
N,M = list(map(int, input ().split()))
s = 2**M
row = []                 # 合法的行
for i in range(s):       # i的范围:00000~11111if check(i): row.append(i)  # 加入合法的行
dp = [[[0 for i in range(s)] for j in range(s)] for k in range (N)] # 初始化dp
for i in row :dp[0][i][0]= 1  # 初始化第0行的符合条件的矩阵数均为1
# 遍历第1~N-1行,统计满足要求的矩阵数量
for i in range(1, N):   # 1~N-1# 对每一行遍历合法行的情况下,再检查连续3列(当前一行和前两行)是否合法for j in row:     for k in row:for p in row:if j & k & p == 0:  # 连续三列不是三个1dp[i][j][k] += dp[i - 1][k][p]
ans = 0
for j in row :ans += sum(dp[N - 1][j])  # 对最后一行求和,其中sum(dp[N - 1][j])是求最后一行的第j中合法状态的和
print(ans)

复杂度:4个for循环mO(N2^{3m})

例题:回路计数

题目描述

蓝桥学院由 21​​​ 栋教学楼组成,教学楼编号 1​​ 到 21​​。对于两栋教学楼 a​​ 和 b​,当 a​ 和 b​ 互质时,a 和 b 之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。

小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?

两个访问方案不同是指存在某个i,小蓝在两个访问方法中访问完教学楼 i 后访问了不同的教学楼。

提示:建议使用计算机编程解决问题。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

Hami lton问题

  •  Hamilton问题是NP问题,没有多项式复杂度的解法。
  • 暴力解法:枚举n个点的全排列。共n!个全排列,一个全排列就是一条路径。本题n=21,21! = 51,090,942,171,709,440,000
  • 用状态压缩DP,复杂度下降为2^n
  • 参考:《算法竞赛》341页,或者csdn搜“罗勇军”找到“状态压缩DP”

状态压缩DP

  • 路径起点是1,绕一圈回到1。
  • 问题转化:1先到2~21中的某个点,然后再绕一圈回到1
  • 定义DP。设S是图的一个子集,用dp[S][j]表示“集合S内的Hamilton路径个数”, 即从起点1出发经过 S中所有点 ,到达 终点j 时的路径个数
  • 最后求所有的访问方案:累加所有的dp[X][2]~dp[X][21]。其中X = 1 << 22 - 2(-2是两个-1,-1是改造21个1,-1是把起点1置为0),X是除了点1以外的所有其他点。

哈密尔顿问题与DP

  • 如何求dp[S][ ]?  从小问题S-j递推到大问题SS - j 表示从集合S中去掉j,即2^{21}21^2不包含j点的集合。
  • 如何从S-j递推到S?  设k是S-j中一个点,把从1到j的路径分为两部分: ( 1→...→k)+(k→j)。以k为变量枚举S-j中所有的点
  • 状态转移方程: dp[S][j]+=dp[S-j][k]
  • 代码:dp[S][j] += dp[S - (1<<j)][k]

 

代码:

初始化:
教学楼编号1到21。教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。

from math import gcdm = 1 << 22
dp = [[0 for j in range(22)] for i in range(m)]
dist = [[False for j in range(22)] for i in range(22)]  # 记录联通关系
for i in range(1, 22):for j in range(1, 22):if gcd(i, j) == 1:  # 最小公因数为1,互质dist[i][j] = True
dp[2][1] = 1  # 初始化dp
for S in range(2, m - 1):   # 遍历所有集合Sfor j in range(1, 22):  # 从21个抽一个j出来if S >> j & 1:   # 集合S中包括jfor k in range(1, 22):if S - (1 << j) >> k & 1 and dist[k][j]:  # 集合S-j包括k,且k和j联通dp[S][j] += dp[S - (1 << j)][k]  # 累加S-j集合
ans = 0
for i in range(2, 22): ans += dp[m - 2][i]
print(ans)
# 881012367360

复杂度:3个for循环
mn^2=221212=924,844,032,运行时间长达5分钟,所以这是一道填空题。
 

相关文章:

算法第十七期——状态规划(DP)之动态压缩

一、总述 状态压缩动态规划&#xff0c;就是我们俗称的状压DP&#xff0c;是利用计算机二进制的性质来描述状态的一种DP方式。 应用背景&#xff1a;以集合为状态&#xff0c;且集合可以用二进制来表示&#xff0c;用二进制的位运算来处理。集合问题一般是指数复杂度的&#x…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第八套解析(详细)

2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (8) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...

【华为OD机试真题 JAVA】数组中是否存在满足规则的数字组合

标题:数组中是否存在满足规则的数字组合 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 给定一个正整数数组,检查数组中是否存在满足规则的数字组合 * 规则: * A = B + 2C 输入描述: * 第一行输出数组的元素个数。 * 接下来一行输出所有数组元素,用空格…...

【OpenCV技能树】——OpenCV基础

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 目前正在进行 OpenCV技能树的学习&#xff0c;OpenCV是学习图像处理理论知识比较好的一个途径&#xff0c;至少比看书本来得实在。本专栏文章主要记录学习Op…...

人体姿态识别

自留记录论文阅读,希望能了解我方向的邻域前沿吧 粗读,持续更新 第一篇 ATTEND TO WHO YOU ARE: SUPERVISING SELF-ATTENTION FOR KEYPOINT DETECTION AND INSTANCE-AWARE ASSOCIATION 翻译:https://editor.csdn.net/md?not_checkout=1&spm=1001.2014.3001.5352&…...

ubuntu下调试驱动

使用 Ubuntu Linux 测试 Linux 驱动 1. 测试 Linux 驱动准备工作 ​ 对于一个 Linux 驱动程序&#xff0c;一开始可以在 Ubuntu Linux 上做前期开发和测试。对于访问硬件部分也可以在 Ubuntu Linux 用软件进行模拟,切记不能代替真实的环境&#xff01;当基本开发完成后&#…...

第十四届蓝桥杯三月真题刷题训练——第 9 天

第 1 题&#xff1a;找素数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 素数就是不能再进行等分的整数。比如&#xff1a;7&#xff0c;11。而 9 不是素数&#xff0c;因为它可以平分为 3 等份。一般认为最小的…...

操作系统复习

熟练掌握操作系统的定义&#xff0c;操作系统的特征&#xff0c;操作系统的功能熟练掌握多道程序设计的概念&#xff0c;单道程序设计和多道程序设计的区别&#xff0c;多道程序设计的优点熟悉操作系统接口的主要功能&#xff0c;系统调用的基本概念、类型、实现。操作系统接口…...

springboot健身房管理系统

springboot健身房管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xf…...

C语言学习笔记——数组

前言 数组是C语言中的一种自定义数据类型&#xff0c;它的使用非常广泛。但是很多新手在使用数组时&#xff0c;经常在一些细节上出问题&#xff0c;导致程序崩溃或者无法编译。今天&#xff0c;我就来详细聊聊数组的使用和我注意到的一些细节。 一、常见的数组类型与数组的创建…...

类和对象 - 中

本文已收录至《C语言》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言 正文 构造函数 对比C和C的初始化 构造函数的使用与特性 默认构造函数 C11关于默认构造缺陷的补丁 析构函数 析构函数特性 默认析构和自定义析构 拷贝构造函数 问题聚焦 拷贝构造的定…...

Android之屏幕适配方案

在说明适配方案之前&#xff0c;我们需要对如下几个概念有所了解&#xff1a;屏幕尺寸&#xff0c;屏幕分辨率&#xff0c;屏幕像素密度。 屏幕尺寸 屏幕尺寸指屏幕的对角线的物理长度&#xff0c;单位是英寸&#xff0c;1英寸2.54厘米。 比如常见的屏幕尺寸&#xff1a;5.0、5…...

SpringBoot+jersey跨域文件上传

一、配置tomcat服务器 1.1、添加upload文件夹 在webapps\Root文件夹下创建用于接收上传文件的upload文件夹 1.2、修改conf\web.xml设置允许上传文件 <init-param><param-name>readonly</param-name><param-value>false</param-value></ini…...

数据结构One——绪论

本喵是FW视频封面最终版宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#…...

JVM篇之内存及GC

目录一、JVM内存区域1.1程序计数器1.2虚拟机栈1.3本地方法栈1.4堆1.5方法区二、JVM运行时内存2.1新生代(轻量级GC)2.2老年代&#xff08;重量级GC&#xff09;一、JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法栈】、线程共享区域【JAVA 堆、…...

Linux驱动操作地址(寄存器)的一些方式

Linux驱动操作地址(寄存器&#xff09;的一些方式 文章目录Linux驱动操作地址(寄存器&#xff09;的一些方式1.对绝对地址赋值操作2. ioremap2.1 void __iomem *地址2.2 volatile unsigned int *地址2.3 structioremap1.对绝对地址赋值操作 对绝对地址0x100000赋值操作 *&…...

Java日志框架介绍

Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Glc首创的&#xff0c;现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。 Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。 Commons Logging Apache基金会所属的项目&#xff0c;是…...

编程中遇到的计算机大小端概念

概念大小端&#xff08;Endian&#xff09;是指在一个多字节的数据中&#xff0c;字节的存储顺序的规定。通俗来说&#xff0c;就是指数据在计算机内部存储时的顺序问题。在计算机系统中&#xff0c;一个数据项可能占据多个存储单元。在这种情况下&#xff0c;这个数据项的存储…...

日志与可视化方案:从ELK到EFK,再到ClickHouse

EFK方案 从ELK谈起 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch&#xff0c;Logstash&#xff0c;Kibana。新增了一个FlieBeat&#xff0c;它是一个轻量级的日志收集处理工具&#xff0c;FlieBeat占用资源少&#xff0c;适用于在各个服务器上搜集…...

字符函数和字符串函数(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰来给大家介绍一个全新的知识点&#xff0c;就是字符函数和字符串函数啦&#xff0c;其实其中有些函数我之前已经学习过了&#xff0c;比如strlen、strcpy&#xff1b;也有一些之前不是很熟悉的函数&#xff0c;比如strstr、strtok…...

九龙证券|下周解禁市值超400亿元,3股解禁压力较大

下周3股解禁比例超50%。 百利电气昨日盘中直线拉升封板&#xff0c;至此&#xff0c;百利电气两连板&#xff0c;累计涨幅20.85%。 昨日晚间&#xff0c;百利电气发布股票交易反常动摇公告称&#xff0c;公司不触及“室温超导”相关业务&#xff0c;也未打开相关研发和投入。公…...

一个大型网站架构的演变历程

正序&#xff1a; Rome was not built in a day&#xff08;罗马不是一天建成的。&#xff09;一个成熟的大型网站从来都不是一蹴而就的&#xff0c;需要经过多次架构的调整和升级&#xff0c;我们熟知的大型网站比如京东、淘宝、亚马逊&#xff0c;它们每天都有巨大的用户访问…...

前端前沿web 3d可视化技术 ThreeJS学习全记录

前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能&#xff0c;但代码量大&#xff0c;难度大&#xff0c;需要掌握很多底层知识和数学知识 Threej…...

链表经典笔试题(LeetCode刷题)

本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳&#xff0c;希望对你有所帮助。 目录 一、移除链表元素 1.1 问题描述 1.2 思路一 1.2.1 分析 1.2.2 代码 1.3 思路二 1.3.1 分析 1.2.3 思路三 1.3 代码实现 1.3.1 思路1的代码 1.3.2 思路2的…...

SpringCloud五大组件

微服务SpringCloud整合技术组件基本流程&#xff1a; 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心&#xff0c;分为Eure…...

Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】

Echart&#xff1f; ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 遵循 Apache-2.0 开源协议&#xff0c;免费商用。 ECharts 兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xf…...

聊聊腾讯T13技术专家被开除

这两天腾讯的技术大佬stonehuang被曝离开腾讯&#xff0c;据他老婆在小红书上发的帖子称是遭遇了裁员&#xff0c;说实话刚看到这个消息我挺震惊的&#xff0c;stonehuang在中国大前端领域是排得上号的专家&#xff0c;同时他2005年就加入了腾讯&#xff0c;在qq空间的发展历程…...

c++ 常见宏、模板用法【1】

目录1、宏定义实现简单的断言2、可变参数模板3、变量模板4、宏定义实现范围内的for循环5、模板实现函数对象6、宏定义实现作用域限定7、类型萃取模板1、宏定义实现简单的断言 #define ASSERT(expr) \if(!(expr)) { \std::cout << "assertion failed: " <&l…...

【25】Verilog进阶 - 序列检测

VL25 输入序列连续的序列检测 本题并不难【中等】难度给高了 【做题关键】 (1)需要使用移位寄存器的思路。其实reg型是寄存器,也可以当做是移位寄存器,重要的是对其的处理,使用的是移位寄存器的思路 (2)注意新移入数据存放在低位 1 题目 + 代码 + TestBench 很简单,没…...

如何绕开运营商的 QoS 限制

运营商针对 UDP 进行限制&#xff0c;这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一&#xff0c;上了线很多问题&#xff0c;丢包&#xff0c;慢等的问题严重增加运维&#xff0c;运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则&#xff0c;只要换一个端口就可…...

官方网站内容可做证据吗/快排seo软件

嗨&#xff0c;你好&#xff0c;我是阿锴。今天分享给大家一个高大上的设计技巧&#xff0c;能让你「傻瓜一键式」把低质量图片变高大上。这个技巧&#xff0c;就是「双色调」。可以把图片处理成下面这个样子&#xff1a;还挺帅对吧&#xff1f;这个技巧的实现原理是什么呢&…...

济南微网站建设/阳山网站seo

为什么80%的码农都做不了架构师&#xff1f;>>> package com.dy.pool;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/*** 在Executors类里面提供了一些静态工厂&#xff0c;生成一些常用的线程池。* 1. newSingleThreadEx…...

地产平面网站/网络营销推广策划

本机存在ssh key 在安装Git前提下&#xff0c;打开Git Bash Here 输入 cd ~/.ssh 进入到.ssh 文件夹 输入 ls 查看.ssh 文件夹里面的文件&#xff0c;有 【id_rsa】【 id_rsa.pub】 known_hosts &#xff0c;ssh秘钥就在 id_rsa.pub文件里 id_rsa是私钥&#xff0c;不能泄露出…...

网站设计开发软件有哪些/怎么注册域名

QT怎么自动一次性修改、替换程序中所有变量名? 熟悉的编译器都有这个功能&#xff0c; 初学QT&#xff0c;搜索无果&#xff0c;找了一会儿&#xff0c;分析给大家。 最直接的办法&#xff1a;选中变量名&#xff0c;CtrlShiftr &#xff0c;变成红色之后即可更改。. 选中变…...

做一个交易网站要花多少钱/邳州网站开发

问题:在AIX操作系统中&#xff0c;用root用户ftp文件到AIX上后&#xff0c;文件的默认权限是rw-r-----&#xff0c;Oracle用户无法读取。有没有办法指定上传文件的权限呢&#xff1f; 环境: AIX 6.1 解决方法&#xff1a; 1、在客户端设置。 关键要看客户端是否支持site命令&a…...

遵义市双控体系建设网站/seo排名点击手机

目录 定时器的时钟选择 选择时钟源 定时器的寄存器 当前值寄存器CNT 预分频寄存器PSC 自动重装载寄存器ARR 控制寄存器CR1 ​中断使能寄存器DIER 定时器操作步骤 1. 使能定时器时钟 2. 定时器参数初始化 3. 定时器中断使能 4. 使能定时器 5. 状态标志位的获取与…...