DP最长上升子序列模型

news2025/1/13 2:34:08

目录

  • 怪盗基德的滑翔翼
    • 代码实现
  • 登山
    • 代码实现
  • 合唱队形
    • 代码实现
  • 友好城市
    • 问题分析
    • 代码实现
  • 最大上升子序列和
    • 代码实现
  • *拦截导弹
    • 问题分析
    • 代码实现
    • 扩展
  • *导弹防御系统
    • 问题分析
    • 代码实现
  • *最长公共上升子序列
    • 问题分析
    • 代码实现


LIS 问题一般有三种解法

  • 朴素版动态规划
  • 贪心+二分
  • 树状数组

怪盗基德的滑翔翼

题目描述:

怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。

而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。

有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。

不得已,怪盗基德只能操作受损的滑翔翼逃脱。

假设城市中一共有 N N N 幢建筑排成一条线,每幢建筑的高度各不相同。

初始时,怪盗基德可以在任何一幢建筑的顶端。

他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。

因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。

他希望尽可能多经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。

请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?

输入格式:

输入数据第一行是一个整数 K K K,代表有 K K K 组测试数据。

每组测试数据包含两行:第一行是一个整数 N N N,代表有 N N N 幢建筑。第二行包含 N N N 个不同的整数,每一个对应一幢建筑的高度h,按照建筑的排列顺序给出。

输出格式:

对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。

数据范围:

1 ≤ K ≤ 100 1≤K≤100 1K100
1 ≤ N ≤ 100 1≤N≤100 1N100
0 < h < 10000 0<h<10000 0<h<10000

输入样例:

3
8
300 207 155 299 298 170 158 65
8
65 158 170 298 299 155 207 300
10
2 1 3 4 5 6 7 8 9 10

输出样例:

6
6
9

代码实现

拆解为从左往右和从右往左的两个最长上升子序列来进行求解

import sys
input = sys.stdin.readline

k = int(input().strip())
for _ in range(k):
    n = int(input().strip())
    nums = list(map(int, input().strip().split()))
    ans1 = ans2 = 0
    f = [1] * n
    for i in range(n):
        f[i] += max((f[j] for j in range(i) if nums[j] > nums[i]), default=0)
        ans1 = max(ans1, f[i])
    f = [1] * n
    for i in range(n - 1, -1, -1):
        f[i] += max((f[j] for j in range(i + 1, n) if nums[j] > nums[i]), default=0)
        ans2 = max(ans2, f[i])
    print(max(ans1, ans2))

登山

题目描述:
五一到了,ACM队组织大家去登山观光,队员们发现山上一共有 N N N 个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。

同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。

队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

输入格式:
第一行包含整数 N N N,表示景点数量。

第二行包含 N N N 个整数,表示每个景点的海拔。

输出格式:
输出一个整数,表示最多能浏览的景点数。

数据范围:
2 ≤ N ≤ 1000 2≤N≤1000 2N1000

输入样例:

8
186 186 150 200 160 130 197 220

输出样例:

4

代码实现

在这里插入图片描述
同理正反序进行最长上升子序列计算

O ( n 2 ) O(n^2) O(n2)

import sys
input = sys.stdin.readline

n = int(input().strip())
nums = list(map(int, input().strip().split()))
pre, suf = [1] * n, [1] * n
for i in range(n):
    pre[i] += max((pre[j] for j in range(i) if nums[i] > nums[j]), default=0)
    suf[n - 1 - i] += max((suf[n - 1 - j] for j in range(i) if nums[n - 1 - i] > nums[n - 1 - j]), default=0)

print(max(pre[i] + suf[i] for i in range(n)) - 1)

O ( n l o g n ) O(nlogn) O(nlogn)

import sys
from bisect import bisect_left
input = sys.stdin.readline

n = int(input().strip())
nums = list(map(int, input().strip().split()))

pre, suf, tmp1, tmp2 = [0] * n, [0] * n, [], []
for i in range(n):
    if tmp1 and tmp1[-1] >= nums[i]:
        idx = bisect_left(tmp1, nums[i])
        pre[i] = idx + 1
        tmp1[idx] = nums[i]
    else:
        tmp1.append(nums[i])
        pre[i] = len(tmp1)

    if tmp2 and tmp2[-1] >= nums[n - 1 - i]:
        idx = bisect_left(tmp2, nums[n - 1 - i])
        suf[n - 1 - i] = idx + 1
        tmp2[idx] = nums[n - 1 - i]
    else:
        tmp2.append(nums[n - 1 - i])
        suf[n - 1 - i] = len(tmp2)

print(max(pre[i] + suf[i] for i in range(n)) - 1)

合唱队形

题目描述:
N N N 位同学站成一排,音乐老师要请其中的 ( N − K ) (N − K) (NK) 位同学出列,使得剩下的 K K K 位同学排成合唱队形。合唱队形是指这样的一种队形:设 K K K 位同学从左到右依次编号为 1 , 2 , … , K 1, 2, …, K 1,2,,K,他们的身高分别为 T 1 , T 2 , … , T K T_1, T_2, …, T_K T1,T2,,TK,  则他们的身高满足 T 1 < … < T i > T i + 1 > … > T K ( 1 ≤ i ≤ K ) T_1<…<T_i>T_{i+1}>…>T_K(1≤i≤K) T1<<Ti>Ti+1>>TK(1iK)

你的任务是,已知所有 N N N 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入格式:

输入的第一行是一个整数 N N N,表示同学的总数。

第二行有 N N N 个整数,用空格分隔,第 i i i 个整数 T i T_i Ti 是第 i i i 位同学的身高(厘米)。

输出格式:

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

数据范围:

2 ≤ N ≤ 100 2≤N≤100 2N100
130 ≤ T i ≤ 230 130≤T_i≤230 130Ti230

输入样例:

8
186 186 150 200 160 130 197 220

输出样例:

4

代码实现

与上题一样的思路

O ( n 2 ) O(n^2) O(n2)

import sys
input = sys.stdin.readline

n = int(input().strip())
nums = list(map(int, input().strip().split()))

pre, suf = [1] * n, [1] * n

for i in range(n):
    pre[i] += max((pre[j] for j in range(i) if nums[i] > nums[j]), default=0)
    suf[n - 1 - i] += max((suf[n - 1 - j] for j in range(i) if nums[n - 1 - i] > nums[n - 1 - j]), default=0)

print(n - max(pre[i] + suf[i] for i in range(n)) + 1)

O ( n l o g n ) O(nlogn) O(nlogn)

import sys
from bisect import bisect_left
input = sys.stdin.readline

n = int(input().strip())
nums = list(map(int, input().strip().split()))

pre, suf, tmp1, tmp2 = [0] * n, [0] * n, [], []
for i in range(n):
    if tmp1 and tmp1[-1] >= nums[i]:
        idx = bisect_left(tmp1, nums[i])
        pre[i] = idx + 1
        tmp1[idx] = nums[i]
    else:
        tmp1.append(nums[i])
        pre[i] = len(tmp1)

    if tmp2 and tmp2[-1] >= nums[n - 1 - i]:
        idx = bisect_left(tmp2, nums[n - 1 - i])
        suf[n - 1 - i] = idx + 1
        tmp2[idx] = nums[n - 1 - i]
    else:
        tmp2.append(nums[n - 1 - i])
        suf[n - 1 - i] = len(tmp2)

print(n - max(pre[i] + suf[i] for i in range(n)) + 1)

友好城市

题目描述:
P a l m i a Palmia Palmia 国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的 N N N 个城市。

北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。

每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。

编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。

输入格式:
1 1 1 行,一个整数 N N N,表示城市数。

2 2 2 行,到第 n + 1 n+1 n+1 行,每行两个整数,中间用 1 1 1 个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。

输出格式:
仅一行,输出一个整数,表示政府所能批准的最多申请数。

数据范围:
1 ≤ N ≤ 5000 , 0 ≤ x i ≤ 10000 1≤N≤5000, 0≤x_i≤10000 1N5000,0xi10000

输入样例:

7
22 4
2 6
10 3
15 12
9 8
17 17
4 2

输出样例:

4

问题分析

在这里插入图片描述
两对城市 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2) 满足下面条件才会造成交叉:

{ x 1 ≥ x 2   & &   y 1 ≥ y 2 x 1 ≤ x 2   & &   y 1 ≤ y 2 \large \left\{\begin{matrix} x_1 \geq x_2 \ \&\& \ y_1 \geq y_2 & \\ x_1 \leq x_2 \ \&\& \ y_1 \leq y_2 & \end{matrix}\right. {x1x2 && y1y2x1x2 && y1y2

要比较两端位置变量的大小关系,可以先对一边的端点进行排序,然后对排序的端点遍历,解决了一个端点的大小关系比较,接下来只用对另一个端点的大小关系进行比较就行了,相当于求另一个端点的最长上升子序列。


代码实现

O ( n 2 ) O(n^2) O(n2)

import sys
input = sys.stdin.readline

n = int(input().strip())
nums = sorted([tuple(map(int, input().strip().split())) for i in range(n)])
f = [1] * n

for i, (_, x) in enumerate(nums):
    f[i] += max((f[j] for j in range(i) if nums[j][1] < x), default=0)
print(max(f))

O ( n l o g n ) O(nlogn) O(nlogn)

import sys
input = sys.stdin.readline
from bisect import bisect_left

n = int(input().strip())
nums = sorted([tuple(map(int, input().strip().split())) for i in range(n)])

tmp = []
for i, (_, x) in enumerate(nums):
    if tmp and tmp[-1] >= x:
        tmp[bisect_left(tmp, x)] = x
    else:
        tmp.append(x)
print(len(tmp))

最大上升子序列和

题目描述:
一个数的序列 b i b_i bi,当 b 1 < b 2 < . . . < b S b_1 < b_2 < ... < b_S b1<b2<...<bS 的时候,我们称这个序列是上升的。

对于给定的一个序列 ( a 1 , a 2 , . . . , a N ) (a_1, a_2, ..., a_N) (a1,a2,...,aN),我们可以得到一些上升的子序列 ( a i 1 , a i 2 , . . . , a i K ) (a_{i_1}, a_{i_2}, ..., a_{i_K}) (ai1,ai2,...,aiK),这里 1 ≤ i 1 < i 2 < . . . < i K ≤ N 1 ≤ i_1 < i_2 < ... < i_K ≤ N 1i1<i2<...<iKN

比如,对于序列 ( 1 , 7 , 3 , 5 , 9 , 4 , 8 ) (1, 7, 3, 5, 9, 4, 8) (1,7,3,5,9,4,8),有它的一些上升子序列,如 ( 1 , 7 ) , ( 3 , 4 , 8 ) (1, 7), (3, 4, 8) (1,7),(3,4,8) 等等。

这些子序列中和最大为 18 18 18,为子序列 ( 1 , 3 , 5 , 9 ) (1, 3, 5, 9) (1,3,5,9) 的和。

你的任务,就是对于给定的序列,求出最大上升子序列和

注意: 最长的上升子序列的和不一定是最大的,比如序列 ( 100 , 1 , 2 , 3 ) (100, 1, 2, 3) (100,1,2,3) 的最大上升子序列和为 100 100 100,而最长上升子序列为 ( 1 , 2 , 3 ) (1, 2, 3) (1,2,3)

输入格式:
输入的第一行是序列的长度 N N N

第二行给出序列中的 N N N 个整数,这些整数的取值范围都在 0 0 0 10000 10000 10000 (可能重复)。

输出格式:
输出一个整数,表示最大上升子序列和。

数据范围:
1 ≤ N ≤ 1000 1 ≤ N ≤ 1000 1N1000

输入样例:

7
1 7 3 5 9 4 8

输出样例:

18

代码实现

从长度换成了总和,朴素动态规划一样的做法。

在此 贪心 + 二分 不好用,贪心二分替换数组后得重新计算一次总和,复杂度可能达到 O ( n 2 l o g n ) O(n^2logn) O(n2logn)

import sys
input = sys.stdin.readline

n = int(input().strip())
nums = list(map(int, input().strip().split()))

# O(n ^ 2)
f = nums.copy()
for i in range(n):
    f[i] += max((f[j] for j in range(i) if nums[i] > nums[j]), default=0)
print(max(f))

*拦截导弹

题目描述:

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度

某天,雷达捕捉到敌国的导弹来袭。

由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于 30000 30000 30000 的正整数,导弹数不超过 1000 1000 1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式:

共一行,输入导弹依次飞来的高度。

输出格式:

第一行包含一个整数,表示最多能拦截的导弹数。

第二行包含一个整数,表示要拦截所有导弹最少要配备的系统数。

数据范围:

雷达给出的高度数据是不大于 30000 30000 30000 的正整数,导弹数不超过 1000 1000 1000

输入样例:

389 207 155 300 299 170 158 65

输出样例:

6
2

问题分析

最多拦截多少个导弹?(动态规划)
经典LIS问题,直接模板解决。

需要多少套拦截系统?(贪心)

遍历当前元素有两种操作:

  1. 接在现有的某个子序列之后
  2. 创建一个新的子序列

先用直觉猜一个做法,保持当前子序列的末尾尽可能的大,因为末尾越大越可能接上其他元素。反 过来思考,对当前元素进行操作时,选取末尾尽可能接近当前元素的前面子序列。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


代码实现

import sys
from bisect import bisect_left

input = sys.stdin.readline

nums = list(map(int, input().strip().split()))

# 第一问
tmp = []
for i, x in enumerate(nums):
    if tmp and tmp[-1] < x:
        l, r = 0, len(tmp)
        while l < r:
            mid = (l + r) // 2
            if tmp[mid] <= x:
                r = mid
            else:
                l = mid + 1
        tmp[l] = x
    else:
        tmp.append(x)

print(len(tmp))

# 第二问
tmp.clear()
for x in nums:
    idx = bisect_left(tmp, x)
    if idx >= len(tmp):
        tmp.append(x)
    else:
        tmp[idx] = x
print(len(tmp))

扩展

Dilworth 定理

  • 把序列分成不升子序列的最少个数,等于序列的最长上升子序列长度
  • 把序列分成不降子序列的最少个数,等于序列的最长下降子序列长度

*导弹防御系统

题目描述:

为了对抗附近恶意国家的威胁, R R R 国更新了他们的导弹防御系统。

一套防御系统的导弹拦截高度 要么 一直 严格单调 上升,要么 一直 严格单调 下降。

例如,一套系统先后拦截了高度为 3 3 3 和高度为 4 4 4 的两发导弹,那么接下来该系统就只能拦截高度大于4的导弹。

给定即将袭来的一系列导弹的高度,请你求出 至少需要多少套防御系统,就可以将它们全部击落。

输入格式:

输入包含多组测试用例。

对于每个测试用例,第一行包含整数 n n n,表示来袭导弹数量。

第二行包含 n n n 个不同的整数,表示每个导弹的高度。

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

输出格式:

对于每个测试用例,输出一个占据一行的整数,表示所需的防御系统数量。

数据范围:

1 ≤ n ≤ 50 1 ≤ n ≤ 50 1n50

输入样例:

5
3 5 2 4 1
0 

输出样例:

2

问题分析

由于导弹拦截高度要么一直上升要么一直下降,所以不能直接使用上一题的结论。

因此采用暴力枚举,问题为当前元素放在上升序列里还是下降序列里,采用上一题贪心的思想,若放到上升序列里,一定放在最后一个元素最大的子序列里,放到下降序列里也同理。


代码实现

import sys
input = sys.stdin.readline
from bisect import bisect_left

while (True):
    n = int(input().strip())
    if not n:
        break
    nums = list(map(int, input().strip().split()))
    ans = 0x3f3f3f3f
    up, down = [0] * n, [0] * n


    def dfs(total, cnt_up, cnt_down):
        global ans
        if cnt_up + cnt_down >= ans:
            return
        if total == n:
            ans = min(ans, cnt_up + cnt_down)
            return

        # 插入上升子序列
        if cnt_up and up[cnt_up - 1] >= nums[total]:
            idx = bisect_left(up, nums[total], 0, cnt_up)
            tmp, up[idx] = up[idx], nums[total]
            dfs(total + 1, cnt_up, cnt_down)
            up[idx] = tmp
        else:
            up[cnt_up] = nums[total]
            dfs(total + 1, cnt_up + 1, cnt_down)

        # 插入下降子序列
        if cnt_down and down[cnt_down - 1] <= nums[total]:
            l, r = 0, cnt_down
            while l < r:
                mid = (l + r) // 2
                if down[mid] <= nums[total]:
                    r = mid
                else:
                    l = mid + 1
            tmp, down[l] = down[l], nums[total]
            dfs(total + 1, cnt_up, cnt_down)
            down[l] = tmp
        else:
            down[cnt_down] = nums[total]
            dfs(total + 1, cnt_up, cnt_down + 1)

    dfs(0, 0, 0)
    print(ans)

*最长公共上升子序列

题目描述:

熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。

小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究 最长公共上升子序列 了。

小沐沐说,对于两个数列 A A A B B B,如果它们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列,而所有的公共上升子序列中最长的就是最长公共上升子序列了。

奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子序列。

不过,只要告诉奶牛它的长度就可以了。

数列 A A A B B B 的长度均不超过 3000 3000 3000

输入格式:

第一行包含一个整数 N N N,表示数列 A , B A,B AB 的长度。

第二行包含 N N N 个整数,表示数列 A A A

第三行包含 N N N 个整数,表示数列 B B B

输出格式:

输出一个整数,表示最长公共上升子序列的长度。

数据范围:

1 ≤ N ≤ 3000 1 ≤ N ≤ 3000 1N3000,序列中的数字均不超过 2 3 1 − 1 2^31−1 2311

输入样例:

4
2 2 1 3
2 1 2 3

输出样例:

2

问题分析

  • LIS(最长上升子序列,Longest Increasing Subsequence)
  • LCS(最长公共子序列,Longest Common Subsequence)
  • LCIS(最长公共上升子序列,Longest Common Increasing Subsequence)

状态表示
在这里插入图片描述


代码实现

O ( n 3 ) O(n^3) O(n3)

import sys

input = sys.stdin.readline
n = int(input().strip())
a = list(map(int, input().strip().split()))
b = list(map(int, input().strip().split()))

f = [[0] * (n + 1) for _ in range(n + 1)]

for i in range(n):
    for j in range(n):
        f[i + 1][j + 1] = f[i][j + 1]
        if a[i] != b[j]:
            continue
        mx = max((f[i][k + 1] for k in range(j) if b[j] > b[k]), default=0) + 1
        f[i + 1][j + 1] = max(f[i + 1][j + 1], mx)
print(max(f[-1][i] for i in range(1, n + 1)))

O ( n 2 ) O(n^2) O(n2)
用一个变量,存储上一个阶段的能够接在 a [ i ] a[i] a[i] 前面的最大的状态值。

import sys
input = sys.stdin.readline

n = int(input().strip())
a = list(map(int, input().strip().split()))
b = list(map(int, input().strip().split()))

f = [[0] * (n + 1) for _ in range(n + 1)]

for i in range(n):
    mx = 1
    for j in range(n):
        f[i + 1][j + 1] = f[i][j + 1]
        if a[i] == b[j]:
            f[i + 1][j + 1] = max(f[i + 1][j + 1], mx)
        if j and a[i] > b[j - 1]:
            mx = max(mx, f[i][j] + 1)
print(max(f[-1][i] for i in range(1, n + 1)))

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

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

相关文章

测试用例要如何写

1、测试点与测试用例 测试点不等于测试用例&#xff0c;这是我们首先需要认识到的。 问题1&#xff1a;这些测试点在内容上有重复&#xff0c;存在冗余。 问题2&#xff1a;一些测试点的测试输入不明确&#xff0c;不知道测试时要测试哪些。 问题3&#xff1a;总是在搭相似…

树与二叉树(数据结构)

本篇博客讲解 树与二叉树&#xff0c;后续会继续讲解堆 —————————————————————— 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看…

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题,报错

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题&#xff0c;报错 1. 报错提醒如下图2. 原因本地安装多个cuda版本导致native寻找到多个版本&#xff0c;导致报错3. 具体配置需要根据你的显卡型号来确认 1. 报错提醒如下图 2. 原因本地安装多个cuda版本导致…

Redis - String 字符串

前言 下表中包含本博客提到的所有命令 字符串类型是 Redis 最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a; 1&#xff09;⾸先 Redis 中所有的键&#xff08;key&#xff09;的类型都是字符串类型&#xff0c;⽽且其他⼏种数据结构也都是在字符串类似基础上…

ffmpeg 滤镜实现不同采样率多音频混音

音频混音在音视频开发中是十分重要的一个环节,所谓音频混音就是将所有需要混音的数据相加得到混音数据,然后通过某个算法进行非法数据的处理;例如相加数值超过最大值,最小值等! 在实际的音频开发中,要实现混音的流程如下: 因此我们的编码实现就分为五部分:寻找…

中经评论:“人工智能+”不止是加法

以下文章来源&#xff1a;经济日报 今年&#xff0c;“人工智能”首次被写入《政府工作报告》&#xff0c;这个新提法为发展数字经济、推进数实融合指明了新路径。值得注意的是&#xff0c;“人工智能”不是简单相加&#xff0c;而是要通过新技术催生新质生产力&#xff0c;为经…

MyBatisPlus 之三:BaseMapper 详解和 CRUD 案例详解

BaseMapper详解 1. SQL 日志开启 为了更好更快学习 MyBatisPlus &#xff0c;需要配置 SQL 日志&#xff0c;这样方便我们能随时看到执行过程中使用的 SQL 语句&#xff0c;有助于理解执行原理及方便 SQL 错误调试 mybatis-plus.configuration.log-implorg.apache.ibatis.logg…

Python 多线程大批量处理文件小程序

说明 平时偶尔需要进行重复性的对文件进行重命名、格式转化等。假设以文件复制功能作为目标&#xff0c;设计一个小程序使用多线程对文件进行批量复制。&#xff08;其实以后主要目标是针对Realsense的raw文件进行批量的转化&#xff0c;并借助多线程加速&#xff09; 代码 i…

深度学习 精选笔记(12)卷积神经网络-理论基础2

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

修改yolov9的模型打印不出来Gflops的解决办法

正在修改yolov9的模块&#xff0c;发现修改后的模型没有GFlops这个参数 解决办法&#xff1a; 找到utils/torch_utils.py这个文件&#xff0c;有一个model_info函数 然后将其中的stride改为固定的640就可以打印了。 stride max(int(model.stride.max()), 32) if hasattr(mo…

扩展学习|网络问政的价值增量与实现条件:基于数据资源挖掘的视角

文献来源&#xff1a;[1]顾丹丹傅广宛.网络问政的价值增量与实现条件:基于数据资源挖掘的视角[J].中国行政管理, 2021, 000(004):76-82.DOI:10.19735/j.issn.1006-0863.2021.04.11. 一、技术赋能网络问政的机制生成 &#xff08;一&#xff09;技术赋能网络问政的流程&#xf…

关于IP-Adapter的十几个模型,到底是干啥用的?

&#x1f3a0;背景介绍 IP-Adapter的一系列模型在stable diffusion的实际应用中&#xff0c;越来越被频繁的使用到&#xff0c;用于“换脸”或者“保证角色的一致性”&#xff0c;但是很多朋友在安装或者使用别人的工作流的时候&#xff0c;经常会遇到各种各样的问题&#xff…

【JavaScript】JavaScript 运算符 ⑤ ( 赋值运算符 | 基础赋值运算符 与 复合赋值运算符 )

文章目录 一、JavaScript 赋值运算符1、赋值运算符 概念2、基础赋值运算符 与 复合赋值运算符3、复合赋值运算符4、完整代码示例 一、JavaScript 赋值运算符 JavaScript 赋值运算符种类 : 基础赋值运算符 : 等于 : ; 复合赋值运算符 : 加等 : 减等 : -乘等 : *除等 : /取模等…

开启Safari手势支持

在使用Safari 的时候&#xff0c;大家有没有觉得不支持手势使用起来不是很方便&#xff0c; 触摸板只支持少量简单的手势&#xff0c;如缩放&#xff0c;滚动等。如果使用鼠标的用户&#xff0c;则完全无法使用手势。经过折腾研究&#xff0c;使用CirMenu应用可以完美解决这个要…

RAID技术知识详解到RAID 10的linux实现过程

1.RAID技术简介 RAID&#xff08;Redundant Array of Independent Disks&#xff09;独立磁盘冗余阵列。通俗来说就是将多个硬盘通过软件或硬件结合成虚拟单台大容量的硬盘使用。 RAID技术的特点&#xff1a; 可以自动检测故障硬盘&#xff1b; 可以重建硬盘坏道的资料&…

VBA批量绘制动态化数据图表

对于大多数使用的VBA的人来说&#xff0c;处理excel工作簿中批量数据是日常工作中常见的情形&#xff0c;但与此同时&#xff0c;VBA在批量绘图方面同样有简洁快速的特点。 说起Excel画图表&#xff0c;考虑一个问题&#xff0c;excel图表的本质是什么&#xff1f;很多人会不假…

便利店小程序有哪些功能

​便利店小程序为附近的住户提供小程序在线购物的服务。用户只需要打开小程序&#xff0c;就可以购买需要的商品&#xff0c;可以选择自取或者配送。整个过程非常简单快速。下面具体介绍便利店小程序的功能。 1. **商品展示**&#xff1a;展示便利店的商品信息&#xff0c;包括…

【C++刷题】优选算法——动态规划第一辑

1.状态表示是什么&#xff1f;简答理解是dp表里的值所表示的含义怎么来的&#xff1f;题目要求经验题目要求分析问题的过程中&#xff0c;发现重复子问题 2.状态转移方程dp[i]......细节问题&#xff1a;3.初始化控制填表的时候不越界4.填表顺序控制在填写当前状态的时候&#…

windows下修改mysql的max_allowed_packet的值

1)C:\Program Files\MySQL\MySQL Server 5.7 在MySQL 的安装目录下添加my.ini文件&#xff0c;同时添加空的data文件 2&#xff09;my.ini文件内容如下&#xff0c; [mysqld] port 3306 basedirC:\Program Files\MySQL\MySQL Server 5.7 datadirC:\Program Files\MySQL\MySQ…

软考78-上午题-【面向对象技术3-设计模式】-结构型设计模式01

一、适配器模式 1-1、意图 个类的接口转换成客户希望的另外一个接口。 Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 1-2、结构 适配器模式分为&#xff1a; 1、适配器类模式&#xff1b; 2、适配器对象模式 类适配器使用多重继承对一个接口与另…