单调队列优化的DP问题

2023-10-26

概述

单调队列就是通过排除求最值时候的冗余,从而是队列具有性质,可以方便求解问题。

DP的两个阶段:

  1. 朴素DP的基本原理——闫氏DP分析法
  2. 对朴素DP进行优化

闫氏DP分析法的拓展 :在一个有限的集合中求最值。

单调队列练习

135. 最大子序和

输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。

注意: 子序列的长度至少是 1。

输入格式

第一行输入两个整数 n,m

第二行输入 n 个数,代表长度为 n 的整数序列。

同一行数之间用空格隔开。

输出格式

输出一个整数,代表该序列的最大子序和。

数据范围

1≤n,m≤300000

输入样例:

6 4
1 -3 5 1 -2 3

输出样例:

7

这道题目是使用暴力的思路想,然后优化。

首先,朴素的思路就是枚举每一个长度不大于m的区间,遍历求最大值。

这里涉及到区间的操作,所以转化为前缀和。

a[x] + ... + a[y] = sum[y] - sum[x - 1]

这时候,我们枚举右端点,sum[y]已经固定,sum[x]需要在滑动的区间内取得最小值,所以使用滑动窗口。

#include <bits/stdc++.h>
using namespace std;
#define N 300020
int n, m;
int s[N];// 前缀和
int q[N];
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++){
        scanf("%d", s+i);
        s[i] += s[i - 1];
    }
    int res = -0x3f3f3f3f;// 由于序列的长度可以为 0
    int hh = 0, tt = -1;
    q[++tt] = 0;// 由于是前缀和,所以应该 包含0
    for(int i = 1; i <= n; i++)
    {
        while(hh <= tt && q[hh] < i - m) hh ++;
        if(hh <= tt) 
            res = max(s[i] - s[q[hh]], res);
        while(hh <= tt && s[q[tt]] >= s[i]) tt --;
        q[++tt] = i;
    }
    printf("%d", res);
    return 0;
}

1088. 旅行问题

John 打算驾驶一辆汽车周游一个环形公路。

公路上总共有 n 个车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。

John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。

在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。

任务:判断以每个车站为起点能否按条件成功周游一周。

输入格式

第一行是一个整数 n,表示环形公路上的车站数;

接下来 n 行,每行两个整数 pi,di,分别表示表示第 i 号车站的存油量和第 i 号车站到 顺时针方向 下一站的距离。

输出格式

输出共 n 行,如果从第 i 号车站出发,一直按顺时针(或逆时针)方向行驶,能够成功周游一圈,则在第 i 行输出 TAK,否则输出 NIE。

数据范围

3≤n≤1e6
0≤pi≤2×1e9
0≤di≤2×1e9

输入样例:

5
3 1
1 2
5 2
0 1
5 4

输出样例:

TAK
NIE
TAK
NIE
TAK

分析

  1. 由于要求解顺时针或者是逆时针,这两种情况具有对称性,所以先考虑一种。
  2. 是一个环,直接求的话不能利用之前已经求解好的状态,所以需要破环成链。
  3. 可以把p[i]d[i]做一个差值。满足要求的情况就是从 i 号点到 i + 1 号点的所有前缀全部是大于0的。
  4. 求解以某一点为结尾的所有不超过n的前缀中的最值问题,就可以使用上一题的思路。

真可谓思路不难,调BUG离谱

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 1000020
ll p[N], d[N], a[N*2];// a表示前缀
int n;
int q[N*2];
bool ans[N];
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++){
        scanf("%lld%lld", p + i, d + i);
    }
    // 顺时针情况************************************
    for(int i = 1; i <= n; i++){
        a[i] = p[i] - d[i];
        a[i + n] = p[i] - d[i];
    }
    for(int i = 1; i <= 2 * n; i++){
        a[i] = a[i] + a[i - 1];
    }
    int tt = -1, hh = 0;
  
  
    for(int i = n * 2; i >= 0; i--)
    {
        while(hh <= tt && q[hh] > i + n) hh ++;
        if(hh <= tt && i < n) {
            if(a[i]<=a[q[hh]]) ans[i+1] = true;
            // a[i]<=a[q[hh]]表示的是i + 1 到 q[hh]的区间之和大于等于0
        } 
        while(hh <= tt && a[q[tt]] >= a[i]) tt--;
        q[++tt] = i;
    }
    // 逆时针情况************************************
  
    d[0] = d[n];
    for(int i = 1; i <= n; i++){
        a[i + n] = a[i] = p[i] - d[i - 1];
    }
    a[0] = 0;
    for(int i = 1; i <= 2 * n; i++){
        a[i] = a[i] + a[i - 1];
    }
  
    tt = -1, hh = 0;
    q[++tt] = 0;
    for(int i = 1; i <= n * 2; i++)
    {
        while(hh <= tt && q[hh] < i - n) hh ++;
        if(hh <= tt && i > n) {
            if(a[q[hh]] <= a[i]) ans[i - n] = true;
            // a[i]<=a[q[hh]]表示的是q[hh]+1到i的区间之和大于等于0
        } 
        while(hh <= tt && a[q[tt]] <= a[i]) tt--;
        q[++tt] = i;
    }
  
  
  
    for(int i = 1; i <= n; i++){
        if(ans[i]){
            puts("TAK");
        }else{
            puts("NIE");
        }
    }
    return 0;
}

二维单调队列问题

1091. 理想的正方形

有一个 a×b 的整数组成的矩阵,现请你从中找出一个 n×n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。

输入格式

第一行为三个​整数,分别表示 a,b,n 的值;

第二行至第 a+1 行每行为 b 个非负整数,表示矩阵中相应位置上的数。

输出格式

输出仅一个整数,为 a×b 矩阵中所有“n×n 正方形区域中的最大整数和最小整数的差值”的最小值。

数据范围

2≤a,b≤1000,
n≤a,n≤b,n≤100,
矩阵中的所有数都不超过 1e9。

输入样例:

5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2

输出样例:

1

这一道题目算是一个典型的二维的滑动窗口问题。

如果直接滑动,那么会比较复杂。所以我们先按照行来,存储row_max[i][j]为以[i][j]结尾的,每行的最值。

然后对于row_max[i][j]再纵着来一下就可以了。

#include <bits/stdc++.h>
using namespace std;
const int N = 1020;
int w[N][N];
int row_max[N][N];
int row_min[N][N];
int n, m, K;
int q[N];
void getmax(int *a, int *b, int tot)
{
    int tt = -1, hh = 0;
    for(int i = 1; i <= tot; i++){
        while(hh <= tt && q[hh] <= i - K) hh++;
        while(hh <= tt && a[q[tt]] <= a[i]) tt--;// BUG1: a[q[tt]] <= a[i]写反了
        q[++tt] = i;
        if(hh <= tt) b[i] = a[q[hh]];
    }
}
void getmin(int *a, int *b, int tot)
{
    int tt = -1, hh = 0;
    for(int i = 1; i <= tot; i++){
        while(hh <= tt && q[hh] <= i - K) hh++;
        while(hh <= tt && a[q[tt]] >= a[i]) tt--;
        q[++tt] = i;
        if(hh <= tt) b[i] = a[q[hh]];
    }
}


int main()
{
  
    scanf("%d%d%d", &n, &m, &K);
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++)
            scanf("%d", &w[i][j]);
    }
    for(int i = 1; i <= n; i++){
        getmax(w[i], row_max[i], m);
        getmin(w[i], row_min[i], m);
        // BUG3:getmin(w[i], row_max[i], m);
    }
    static int a[N], b[N], c[N];
    int res = 0x7f7f7f7f;
    for(int i = K; i <= m; i++)
    {
        for(int j = 1; j <= n; j++) a[j] = row_max[j][i];// BUG 2:要从1开始(虽然K之前不参与更新res,但是参与求最值)
        getmax(a, b, n);
        for(int j = 1; j <= n; j++) a[j] = row_min[j][i];
        getmin(a, c, n);
        for(int i = K; i <= n; i++) res = min(res, b[i] - c[i]);
    }
    printf("%d\n", res);
    return 0;
}

使用单调队列来优化DP

1089. 烽火传递

烽火台是重要的军事防御设施,一般建在交通要道或险要处。

一旦有军情发生,则白天用浓烟,晚上有火光传递军情。

在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价。

为了使情报准确传递,在连续 m 个烽火台中至少要有一个发出信号。

现在输入 n,m 和每个烽火台的代价,请计算在两城市之间准确传递情报所需花费的总代价最少为多少。

输入格式

第一行是两个整数 n,m,具体含义见题目描述;

第二行 n 个整数表示每个烽火台的代价 ai。

输出格式

输出仅一个整数,表示最小代价。

数据范围

1≤m≤n≤2e5
0≤ai≤1000

输入样例:

5 3
1 2 5 6 2

输出样例:

4

这一道题目可能会想到状态机,但是使用状态机的话就必须有m个状态,并不切合实际。

设状态:f[i]表示从第一个到第 i 个,并且第 i 个被点燃的情况下的最小花费。

我们把n+1的代价视为0,点燃n + 1视为DP结束。

对于当前的,选择dp[i - m], dp[i - m + 1] ..... d[i -1]中的最小的,这满足滑动窗口

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int n, m;
int dp[N];
int q[N];
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", a+i);
    int hh = 0, tt = -1;
    q[++tt] = 0;
    for(int i = 1; i <= n + 1; i ++){
        while(hh <= tt && q[hh] < i - m) hh ++;
        if(hh <= tt) dp[i]=  dp[q[hh]] + a[i];
        while(hh <= tt && dp[q[tt]] >= dp[i]) tt --;
        q[++tt] = i;// 注意:队列里面存放的一直都是下标
    }
    printf("%d\n", dp[n + 1]);
    //for(int i = 1; i <= n+1; i++) cout << dp[i] << "  ";
    return 0;
}

1090. 绿色通道

高二数学《绿色通道》总共有 n 道题目要抄,编号 1,2,…,n,抄第 i 题要花 ai 分钟。

小 Y 决定只用不超过 t 分钟抄这个,因此必然有空着的题。

每道题要么不写,要么抄完,不能写一半。

下标连续的一些空题称为一个空题段,它的长度就是所包含的题目数。

这样应付自然会引起马老师的愤怒,最长的空题段越长,马老师越生气。

现在,小 Y 想知道他在这 t 分钟内写哪些题,才能够尽量减轻马老师的怒火。

由于小 Y 很聪明,你只要告诉他最长的空题段至少有多长就可以了,不需输出方案。

输入格式

第一行为两个整数 n,t。

第二行为 n个整数,依次为 a1,a2,…,an

输出格式

输出一个整数,表示最长的空题段至少有多长。

数据范围

0<n≤5e4
0<ai≤3000
0<t≤1e8

输入样例:

17 11
6 4 5 2 5 3 4 5 2 3 4 5 2 3 6 3 5

输出样例:

3

题解

这一道题目在具体做决定的时候,会发现并不知道最终答案,导致过程中无法把握舍与得。

这时候我们可以想到使用二分答案。

容易得知,显然具有单调性。

二分之后,就是相当于判断相邻两个最远的距离是mid,求出抄完的时间满不满足。

(大致思路和上一道题目类似)

#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 20;
int a[N];
int T, n;
int f[N], q[N];

bool ck(int mid)
{
    int hh = 0, tt = -1;
    q[++tt] = 0;
    for(int i = 1; i <= n + 1; i++){
        while(hh <= tt && q[hh] < i - mid - 1) hh ++;
        if(hh <= tt) f[i] = f[q[hh]] + a[i];
        while(hh <= tt && f[q[tt]]>= f[i]) tt --;
        q[++tt] = i;
    }
    //cout << mid << "  " << f[n + 1] << "\n"; 
    if(f[n + 1] <= T) return true;
    else return false;
}
int main()
{
    scanf("%d%d", &n, &T);
    for(int i = 1; i <= n; i++) scanf("%d", a + i);
    int l = 0, r = n;
    while(l < r){
        int mid = (l + r) >> 1;
        if(ck(mid)) r = mid;
        else l = mid + 1;
    }
    printf("%d", l);
    return 0;
}

1087. 修剪草坪

在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪。

现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠。

然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作。

FJ 有 N 只排成一排的奶牛,编号为 1 到 N

每只奶牛的效率是不同的,奶牛 i 的效率为 Ei。

编号相邻的奶牛们很熟悉,如果 FJ 安排超过 K 只编号连续的奶牛,那么这些奶牛就会罢工去开派对。

因此,现在 FJ 需要你的帮助,找到最合理的安排方案并计算 FJ 可以得到的最大效率。

注意,方案需满足不能包含超过 K 只编号连续的奶牛。

输入格式

第一行:空格隔开的两个整数 NK

第二到 N+1行:第 i+1 行有一个整数 Ei。

输出格式

共一行,包含一个数值,表示 FJ 可以得到的最大的效率值。

数据范围

1≤N≤1e5
0≤Ei≤1e9

输入样例:

5 2
1
2
3
4
5

输出样例:

12

样例解释

FJ 有 5 只奶牛,效率分别为 1、2、3、4、5。

FJ 希望选取的奶牛效率总和最大,但是他不能选取超过 2 只连续的奶牛。

因此可以选择第三只以外的其他奶牛,总的效率为 1 + 2 + 4 + 5 = 12。

题解一

其实从上面两道题目中可以看出来:

对于区间中连续的m个中,必须选择一个

这种情况,可以使用单调队列进行优化。

所以,在这里可以反过来思考,这样就转化为了上面的思路。

f[i]表示不选择第 i 个数字,在前 i 个数字中不选择的数字加起来的最小值。

在任意一个连续的区间内,需要满足在 K+1 的范围内至少有一个不选择。

最后使用总的和减去上述求出的结果就行。

题解二-y总思路

状态表示:f[i]表示从前 i 个奶牛中选择,并且满足没有连续选择超过 K 头奶牛的所有情况。

属性:最大值。

转移:

  1. 不选择第 i 头奶牛,那么f[i] = f[i - 1]
  2. 选择第 i 头奶牛
    这时候应该注意不能让连续的大于K

对于第二种情况:

枚举x ( 1 ≤ x ≤ K ) (1\le x\le K) (1xK),表示选择了包括 i 在内的从后往前数的连续 x 个奶牛,第 i − x i - x ix头奶牛不选的所有情况中的最大值。

由于涉及到区间问题,转化为前缀和。

有状态转移公式:f[i] = s[i] - s[i - x] + f[i - x - 1] ( 1 ≤ x ≤ K ) (1\le x\le K) (1xK)

为了方便表示,令 g ( x ) = f [ x − 1 ] − s [ x ] g(x) = f[x - 1] - s[x] g(x)=f[x1]s[x]

边界情况:

g ( 0 ) g(0) g(0):这种情况表示的是从 1 到 i 全部选择的情况。应该为0.

g ( 1 ) g(1) g(1)f[0]为0,表示不选择任何奶牛的最大值。

#include <bits/stdc++.h>
using namespace std;
int n, K;
const int N = 1e5 + 20;
typedef long long ll;
ll s[N];
ll f[N];
ll q[N];
inline ll g(ll x){
    if(!x) return 0;
    return f[x - 1] - s[x];
}
int main()
{
    scanf("%d%d", &n, &K);
    for(int i = 1; i <= n; i++){
        scanf("%lld", s + i);
        s[i] += s[i - 1];
    }
    int hh = 0, tt = -1;
    q[++tt] = 0;
    for(int i = 1; i <= n; i++)
    {
        while(hh <= tt && q[hh] < i - K) hh ++;
        if(hh <= tt) f[i] = max(f[i - 1], s[i] + g(q[hh]));
        // BUG 记录:只顾着写单调队列优化了,忘了还有不选择这种情况
        while(hh <= tt && g(q[tt]) <= g(i)) tt--;
        q[++tt] = i;
    }
    printf("%lld", f[n]);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单调队列优化的DP问题 的相关文章

  • C++ 令人头疼的命名空间

    好吧 这个问题已经发生了一些变化 我想尝试从我正在追求的基本目标开始 重新 创建在 C 资源获取和初始化中包装遗留 C 语言实体的库代码 并提供基本或更好的异常保证 使此代码的客户端能够以非常自然的 C 方式使用它 而不会为现有代码创建大量
  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • Windows Server / Datacenter:设置 CPU 关联性 > 64 个核心

    SetThreadAffinityMask 允许为 64 个逻辑核心 处理器 设置关联掩码 但是 Windows Datacenter 最多可以有 64 个 CPU 每个 CPU 都有多个内核 请参阅here http social tec
  • F1 2019 UDP解码

    我目前正在为 F1 方向盘开发自己的显示器 F1 2019 由codemasters提供 通过UDP发送数据 该数据存储在字节数组中 我在解码返回的数组时遇到一些问题 问题是我得到了很多信息 但我不知道如何处理它们 我将向您介绍我所尝试过的
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se
  • 将 MyGeneration 与 Fluent NHibernate 结合使用

    我在这里找到了一个使用 MyGeneration 生成 NHibernate 代码的绝佳模板 http vucetica blogspot com 2009 01 nhibernate template for my Generation
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 以 ASCII 字符串形式获取 MemoryStream 内容的快速方法

    我在 MemoryStream 中有一个 JSON 字符串 我使用以下代码将其作为 ASCII 字符串获取 MemoryStream memstream new MemoryStream Write a JSON string to mem
  • JObject ToString 与 StringEnumConverter 不起作用

    我正在尝试序列化一个匿名类 如下所示 public enum ErrorCode A B C var response JObject FromObject new Error new Message Test Code ErrorCode
  • boost::unordered_map 是...有序的吗?

    我有一个 boost unordered map 但它看起来是有序的 给我一种压倒性的 你做错了 的感觉 为什么输出是这样的 我希望底层的哈希算法能够随机化这个顺序 include
  • 提高 ASP.NET/C# 编译速度的最佳方法是什么?

    更新 请将您的答案集中在硬件解决方案上 您使用什么硬件 工具 插件来提高 ASP NET 编译和首次执行速度 我们正在寻找固态硬盘来加快速度 但现在价格确实很高 我现在有两个 RAID 0 的 7200 rpm 硬盘 但我对性能不再满意 所
  • 如何对具有无效值的属性使用 JSON.net 的默认值

    我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应 问题是某些字段包含无效值 例如 一条记录上的一个字段包含一个 T 表示该字段应该是数字 我想做的是将无效字段的值设置为 null 或其他默认值 我的所有属性都
  • 委托:方法名称预期错误

    我正在尝试让以下简单的委托示例正常工作 根据我从中取出的一本书 应该没问题 但我得到了Method name expected error namespace TestConsoleApp class Program private del
  • 枚举和枚举类之间的区别[重复]

    这个问题在这里已经有答案了 谁能解释一下两者之间的区别 enum Type1 type2 And enum class Type1 type2 我经常使用前者 可能太频繁而没有足够的封装 但我从未使用过第二个例子 Thanks enum A
  • 二叉树实现C++

    二叉树插入 include stdafx h include
  • 使用本地系统帐户运行时,GetAccessControl 方法失败,出现意外错误代码 3

    我已经创建了 Windows 服务并使用本地系统帐户运行它 该服务正在读取用户文件并查找其所有者 在获取文件的访问权限以查找所有者时 它抛出以下异常 方法失败 出现意外错误代码 3 StackTrace 在 System Security
  • 初学者友好的方法来获取所有文件和目录的列表

    使用 NET 3 0 我得到了下面的方法 它可以正确返回指定目录的所有文件和目录 以及子目录 的集合 如果可能的话 我想将其简化为仅使用我非常熟悉的结构 具体来说 有以下几点我不太清楚 1 IEnumerable
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤

随机推荐

  • Pycharm连接Mysql数据库

    import pandas as pd import pymysql from sqlalchemy import create engine 创建一个Mysql连接器 用户名为root 密码123456 地址为127 0 0 1 数据库名
  • 游戏开发日志17(保存技能树信息)

    最开始的想法是这样的 在GameManage中写一个public List
  • 剑指 Offer 50. 第一个只出现一次的字符(C++实现)

    剑指 Offer 50 第一个只出现一次的字符https leetcode cn problems di yi ge zhi chu xian yi ci de zi fu lcof 遍历两次数组 第一次遍历 通过哈希表记录每个字母出现的次
  • CMake中configure_file的使用

    CMake中的configure file命令用于将一个文件拷贝到另一个位置并修改其内容 其格式如下 configure file
  • 微信网页开发调用微信jssdk接口遇到的坑以及最终解决方法 (持续更新)

    1 微信网页开发调用jssdk时报permission denied 大致是两个原因 1 首先注册时未将你所调用的接口名字添加至jsApiList 2 第二个就是你的这个公众号没有权限使用这个api 例如在开发环境中的微信页面就无法调取这个
  • (六)使用Transformers进行情感分析

    文章目录 准备数据 搭建模型 训练模型 推断 完整代码 在本笔记本中我们将使用在本 论文中介绍的Transformer模型 具体来说 我们将使用来自这篇 论文中的BERT Bidirectional Encoder Representati
  • 《KyLin学习理解》-01-KyLin麒麟的简介及其思想

    1 美图 1 诞生背景 HIVE是数据仓库 是把存储在HDFS分布式文件系统的存储文件映射到类似于关系型数据库的东西 举个例子 假设有一个文件存储在本地 opt hzjs lcc work pro txt文件 文件的格式为 1 产品120
  • html 单选打勾效果,checkbox 实现单选效果(html)

    note 在html 标签类中的checkbox实现单选效果 在最近的开发项目中 客户要求使用小方格子实现 单选 功能 显然圆点的radio被out了 只能选择chckbox的方块样式 也在网上搜过 可能有点儿脑残 没有找到 废话不多说直接
  • c++网络编程3:UDP编程

    一 概念 UDP是传输层中面向无连接的协议 所以UDP丢包后是不会重传的 而且他在编程上服务端和客户端是没有区别的 有的只是 虚拟上 的服务端和客户端 他在编程的实现上也很简单 不像TCP那么复杂 二 UDP终端的编程 由于UDP在服务端和
  • 不同型号服务器esxi,如果管理多个esxi服务器

    如果管理多个esxi服务器 没有 装一个vcenter吧 可以集中管理 多台服务器之间还可以做双机热备等功能 很好用 至于注册序列号 你漫天都是 你可以把分数拉高一点 我送给你一个 哈哈 如何给esxi搭建ntp服务器 提在ESX ESXi
  • Windows系统的JDK安装与配置

    1 选择JDK版本 以在Windows 64位平台上安装JDK 8版本为例 JDK 8 Windows版官网下载地址 https www oracle com java technologies downloads java8 window
  • Redis的安装

    环境 用的Linux系统阿里云服务器 1 在redis官网下载最新稳定版的安装包 官网网址 https redis io 2 下载完的安装包通过Xftp上传到 opt目录下 3 连接上远程服务器60 205 189 176端口22 输入下面
  • 离线实时一体化数仓与湖仓一体—云原生大数据平台的持续演进

    林伟 阿里云智能研究员 阿里云智能通用计算平台MaxCompute 机器学习PAI平台技术负责人 本篇内容将从三个部分为读者讲述离线实时一体化数仓与湖仓一体 云原生大数据平台的持续演进 通过从数据湖到数仓的历史 反思为什么要做湖仓一体 以及
  • 向“全栈”进发,大型线上商城实战项目,Spring Boot + Vue 前后端分离版本的商城来了(文末有视频)

    新蜂商城 Vue 版本 它来了 文末有视频 如上图所示 新蜂商城 Vue 版本已经开发完成 这是新蜂商城开源项目的第一个大版本更新 根据大量的用户调研 最终决定将新蜂商城升级为 Spring Boot Vue 两个流行技术栈的前后端分离商城
  • Web开发-基础环境配置

    Web开发 基础环境配置 回炉再造 2021 Vue3 0 前端全家桶学习笔记 web前端职业发展路线 技术范围广 发展速度快 兼容浏览器众多 核心技术 html css JavaScript BOM DOM 新的技术 html5 css3
  • QT5使用PCAN读取CAN数据

    文章目录 QT5使用PCAN读取CAN数据 CAN Bus example 重点讲解 pro文件 创建CAN bus Device 参数设置 接收报文 PCAN支持的QCanBusDevice ConfigurationKey类型 QT5使
  • IDEA 插件代理设置

    一 ctrl alt s 打开设置
  • pytorch JIT浅解析

    概要 Torch Script中的核心数据结构是ScriptModule 它是Torch的nn Module的类似物 代表整个模型作为子模块树 与普通模块一样 ScriptModule中的每个单独模块都可以包含子模块 参数和方法 在nn M
  • Python告诉你:李子柒的螺蛳粉到底有多火?

    居家隔离的日子里 各类方便速食食品成了许多人的心头爱 特别是螺蛳粉 异军突起 火遍全网 几乎卖到脱销 有的螺蛳粉热销店铺的购买页面还显示 现在下单 预售40天后发货 这是种什么操作 万万没想到 这些日子发不出货的 除了口罩 还有螺蛳粉 今天
  • 单调队列优化的DP问题

    概述 单调队列就是通过排除求最值时候的冗余 从而是队列具有性质 可以方便求解问题 DP的两个阶段 朴素DP的基本原理 闫氏DP分析法 对朴素DP进行优化 闫氏DP分析法的拓展 在一个有限的集合中求最值 单调队列练习 135 最大子序和 输入