动态规划(Dynamic programming)讲解(线性 DP 篇)

news2024/10/7 12:27:33

文章目录

动态规划(Dynamic Programing)

动态规划就是通过记住过去所算过的值,来防止重复计算所带来的弊端。这就是为什么动态规划也可以写成记忆化搜索的形式。

下面,我们通过 DP 的题目,假设我们对其的感悟!(大家可以边看边做一下这几道题,都是很好的题目)


第一关:线性DP

第一战: C F 191 A .   D y n a s t y P u z z l e s \color{7F25DF}{CF191A.\space Dynasty\enspace Puzzles} CF191A. DynastyPuzzles

题目描述

难度: ☆☆☆ \color{blue}{☆☆☆} ☆☆☆

题目大意

题目描述

有一个王朝,他们国王的名字用姓氏的简写来标记每一代。为了保证王朝的稳定,现在这个王朝的继承人的名字需要满足继承者名字的第一个字母要和前代名字最后一个字母相同。然后拼接起来的名字,第一个字母和最后一个字母相同。现在有一个考古博士,知道了这个王朝国王和亲戚的名字。问你这个王朝所能够得到的最长字符串。

输入

第一行一个整数 n n n ( 1 ≤ n ≤ 5 ⋅ 1 0 5 1≤n≤5·10^5 1n5105),接下来 n n n行,每行一个非空字符串,全由小写字母组成,字符串长度不超过 10 10 10

输出

最长满足要求的长度,如果没有输出 0 0 0


思路

动态规划莫过于 4 4 4 步:

  1. 状态的定义
  2. 转移的推导
  3. 边界的确定
  4. 结果的输出
状态的定义:

可以设 f i , j f_{i, j} fi,j 表示当前名字的第一个字母为 i i i,最后一个字母为 j j j 的最长串。
但是,字母不容易开数组,所以我们可以将其压缩成 0 ∼ 26 0\sim26 026 的整数。


转移的推导

之后,我们不难想到对于每一个长度为 n n n 字符串 S S S f j , S n = m a x ( f j , S n , f j , S 1 + n ) f_{j, S_n}=max(f_{j, S_n}, f_{j, S_1} + n) fj,Sn=max(fj,Sn,fj,S1+n)
注意,如果这是我们所拼接的第一个串,那么 f S 1 , S n = n f_{S_1, S_n} = n fS1,Sn=n,不能在通过上面的转移方式转移,因为第一个字母只能是 S 1 S_1 S1


边界的确定

因为,我们要确定每一个串是否是我们拼接的第一个串,所以我们上来要把 f f f 数组全部赋值为 i n t int int 的最小值。


结果的输出

那么这道题最终他的名字其实就是首位字母相同的串,故所有串中首位相同的最长串即为答案!
r e s = m a x ( f i , i ) res=max(f_{i, i}) res=max(fi,i)

一首小诗作为总结:

名字首 i i i 最后 j j j,状态设为 f i , j f_{i, j} fi,j
方程转移枚举头,加入 i i i 串转移透。
边界一定要注意,设小为保第一串。
最后结果首尾同,即为最值 f i , i f_{i,i} fi,i


时间复杂度: O ( n ) \color{blue}{O(n)} O(n)

代码

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 30;

int n;
string name;
int f[N][N];

signed main()
{
	cin >> n;
	
	memset(f, -0x3f, sizeof f);
	for (int i = 1; i <= n; i ++)
	{
		cin >> name;
		int len = name.size(), l = name[0] - 'a', r = name.back() - 'a';
		for (int j = 0; j < 26; j ++)
			f[j][r] = max(f[j][r], f[j][l] + len);
		f[l][r] = max(f[l][r], len); //初始所有值都是-0x3f3f3f3f,所以取个max就能够让第一个串赋值
	}
	
	int res = 0;
	for (int k = 0; k < 26; k ++)
		res = max(res, f[k][k]);
		
	cout << res << endl;
	
	return 0;
}

恭喜您,成功战胜了 C F 191 A .   D y n a s t y P u z z l e s \color{7F25DF}{CF191A.\space Dynasty\enspace Puzzles} CF191A. DynastyPuzzles,奖励怪兽等级一份:

B r o n z e M o n s t e r \color{97EF6A}{Bronze\enspace Monster} BronzeMonster
U n u s u a l M o n s t e r \color{F9E55D}{Unusual\enspace Monster} UnusualMonster
E p i c M o n s t e r \color{7F25DF}{Epic\enspace Monster} EpicMonster
L e g e n d a r y M o n s t e r \color{CC1D26}{Legendary\enspace Monster} LegendaryMonster


第二战: C F 455 A . B o r e d o m \color{F9E55D}{CF455A. \enspace Boredom} CF455A.Boredom

题目描述

难度: ☆☆ \color{blue}{☆☆} ☆☆

题目大意

给定一个有 n n n 个元素的序列 { a n } \{a_n\} {an}。你可以做若干次操作。在一次操作中我们可以取出一个数(假设他为 x x x)并删除它,同时删除所有的序列中值为 x + 1 x+1 x+1 x − 1 x-1 x1 的数。这一步操作会给玩家加上 x x x 分。

输入

输入格式 第一行一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1n105),说明这个序列有多少数。 第二行 n n n 个整数,分别表示 a 1 , a 2 , ⋯   , a n a_1,a_2,\cdots,a_n a1,a2,,an

输出

一个整数,表示玩家最多能获得多少分


思路

动态规划 4 4 4 步:

  1. 状态的定义
  2. 转移的推导
  3. 边界的确定
  4. 结果的输出
状态的定义:

首先我们会想到设 f i , 0 / 1 f_{i, 0/1} fi,0/1 表示 a i a_i ai删除或者是不删除,但是发现不是很好转移,于是我们可以在这里插入图片描述

嘿嘿,才怪。故而,我们再想一想,他前后删除的是所有值,所以设 f i , 0 / 1 f_{i, 0/1} fi,0/1 表示前 i i i 个数中,数字 i i i 删除还是不删除会不会简单一些呢?
在这里插入图片描述


转移的推导

不难想到,设 c n t i cnt_i cnti i i i 出现的次数,
{ f i , 1 = m a x ( f i − 2 , 0 , f i − 2 , 1 ) + c n t i × i f i , 0 = m a x ( f i − 1 , 1 , f i − 1 , 0 ) \begin{cases} & f_{i, 1} = max(f_{i - 2, 0}, f_{i - 2, 1})+cnt_i\times i\\ & f_{i, 0} = max(f_{i - 1, 1}, f_{i - 1, 0}) \end{cases} {fi,1=max(fi2,0,fi2,1)+cnti×ifi,0=max(fi1,1,fi1,0)
因为,如果选了数 i i i,那么贡献就是 c n t i × i cnt_i\times i cnti×i,那么 i − 1 i - 1 i1 也一定不能选。但是 i − 2 i - 2 i2 是可以选的呀!如果不选数 i i i,那么就考虑 i − 1 i - 1 i1选不选。


边界的确定

貌似不需要


结果的输出

不难想,就是 m a x ( f m x , 0 , f m x , 1 ) max(f_{mx, 0}, f_{mx, 1}) max(fmx,0,fmx,1) m x mx mx表示序列中最大的元素。
因为,我们考虑了前面所有的元素,最终就是这两个取其一!

一首小诗总结一下

这题状态要小心,不设下标却设数。
转移若选找前 2 2 2,如果不选看前值。
边界确定仔细想,貌似根本不需要。
最终结果找 m x mx mx,选或不选取个 m a x max max


时间复杂度: O ( n ) \color{blue}{O(n)} O(n)

代码

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 1e5 + 10;

int n;
int a[N], f[N][2], cnt[N];

signed main()
{
	cin >> n;
	
	int mx = 0;
	for (int i = 1; i <= n; i ++)
		cin >> a[i], cnt[a[i]] ++, mx = max(mx, a[i]);
		
	for (int i = 1; i <= mx; i ++)
	{
		f[i][1] = max(f[i - 2][1], f[i - 2][0]) + cnt[i] * i;
		f[i][0] = max(f[i - 1][1], f[i - 1][0]);
	}
		
	cout << max(f[mx][1], f[mx][0]) << endl;
	
	return 0;
}

恭喜您,成功战胜了 C F 455 A . B o r e d o m \color{F9E55D}{CF455A. \enspace Boredom} CF455A.Boredom,奖励继续看题(嘿嘿)


第三战: C F 1061 C . M u l t i p l i c i t y \color{7F25DF}{CF1061C. \enspace Multiplicity} CF1061C.Multiplicity

题目描述

难度: ☆☆☆ \color{blue}{☆☆☆} ☆☆☆

题目大意

从序列 { a 1 ,   a 2 ,   . .   ,   a n } \{a_1,\ a_2,\ ..\ ,\ a_n\} {a1, a2, .. , an} 中选出非空子序列 { b 1 ,   b 2 ,   . .   ,   b k } \{b_1,\ b_2,\ ..\ ,\ b_k\} {b1, b2, .. , bk},一个子序列合法需要满足 ∀   i ∈ [ 1 ,   k ] ,   i   ∣   b i \forall\ i \in [1,\ k],\ i\ |\ b_i  i[1, k], i  bi。求有多少互不相等的合法子序列,答案对 1 0 9 + 7 10^9 + 7 109+7 取模。

序列 { 1 ,   1 } \{1,\ 1\} {1, 1} 2 2 2 种选法得到子序列 { 1 } \{1\} {1},但 1 1 1 的来源不同,认为这两个子序列不相等。

思路

动态规划需要 5 5 5 步了:

  1. 状态的定义
  2. 转移的推导
  3. 边界的确定
  4. 结果的输出
  5. 动归的优化
状态的定义:

由于题意中设计到了第 i i i 个数必须被 i i i整除,所以我们可以想到长度,于是可以考虑用 f i , j f_{i, j} fi,j 表示对于前 i i i 个数来说,长度为 j j j 的方案数。


转移的推导

{ f i , j = f i , j + f i − 1 , j j ∣ a i f i , j = f i − 1 , j o t h e r w i s e \begin{cases} & f_{i, j} = f_{i, j} + f_{i - 1, j} &j\mid a_i\\ & f_{i, j} = f_{i-1,j} &otherwise \end{cases} {fi,j=fi,j+fi1,jfi,j=fi1,jjaiotherwise
因为,如果 a i a_i ai j j j 的倍数,那么就可以加入序列中,所以可以加上前一个长度。反之,不可以,不能加入,所以长度不减 1 1 1


边界的确定

起初,长度为 0 0 0 时规定有一种转移方式,即 f 0 , 0 = 1 f_{0, 0}=1 f0,0=1


结果的输出

最终的结果就是所有可能长度之和,即 r e s = ∑ i = 1 n f n , i res=\sum\limits_{i=1}^{n}f_{n, i} res=i=1nfn,i


动归的优化

这道题涉及到了动态规划的优化,因为我们会发现,两维的状态根本开不出来,会
所以,这时候,细心地我们发现转移的时候只用到了 i − 1 i-1 i1,那么我们就可以仿照01背包的方式,用个滚动数组把第一维滚掉,当然这样在枚举长度的时候要倒着枚举!
OK,数组是开下了,可是时间呢?还是炸,我们不妨算一下,#^&%!$# ……*&%¥&@,时间复杂度 O ( n 2 ) O(n^2) O(n2)!完了,芭比球了!

没事,不要慌,慌你就输了。我们再细心的观察一下,就会发现,咦好像只有在 j ∣ a i j\mid a_i jai的时候才可以转移,所以我们就能够先把 a i a_i ai 的约数列出来( O ( n ) O(\sqrt{n}) O(n )),然后进行转移( O ( n ) O\sqrt(n) O( n))。

诶?好像可以了诶,时间复杂度到了 O ( n n ) O(n\sqrt{n}) O(nn ),这样就可以跑过去了!


一首小诗总结一下

状态无妨设两维,之后再用滚动压。
转移只当 j ∣ a j\mid a ja,所以可以找约数。
边界 0 0 0 长设为 1 1 1,之后才可好转移。
最后求和所有长,直接输出 A C AC AC 现。


时间复杂度: O ( n n ) \color{blue}{O(n\sqrt{n})} O(nn )

代码

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 1e6 + 10, mod = 1e9 + 7;

int n;
int a[N];
int f[N];
vector<int> gt;

signed main()
{
	cin >> n;
	
	f[0] = 1;
	for (int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		gt.clear();
		for (int j = 1; j <= a[i] / j; j ++)
			if (a[i] % j == 0)
			{
				gt.push_back(j);
				if (a[i] / j != j) gt.push_back(a[i] / j);
			}
		
		sort(gt.begin(), gt.end(), greater<int>());
		for (auto c : gt)
			f[c] = (f[c] + f[c - 1]) % mod;
	}
	
	int res = 0;
	for (int i = 1; i <= n; i ++)
		res = (res + f[i]) % mod;
		
	cout << res << endl;
	
	return 0;
}

恭喜您,成功战胜了 C F 1061 C . M u l t i p l i c i t y \color{7F25DF}{CF1061C. \enspace Multiplicity} CF1061C.Multiplicity,奖励一次问而必答的机会,验证码6AZ70好像没什么用 )+简单题讲解。


第四战: A B C 311 E − D e f e c t   f r e e   S q u a r e s \color{F9E55D}{ABC311E - Defect\ free\ Squares} ABC311EDefect free Squares

题目描述

题目大意

给出一个 H × W H\times W H×W 的矩阵,每个位置要么有洞,要么没洞,问有多少个每个元素均为正整数的三元组 ( x , y , n ) (x,y,n) (x,y,n),满足:

x + n − 1 ≤ H x+n-1\le H x+n1H y + n − 1 ≤ W y+n-1\le W y+n1W,以 ( x , y ) (x,y) (x,y) 为左上角、 ( x + n − 1 , y + n − 1 ) (x+n-1,y+n-1) (x+n1,y+n1) 为右下角的矩阵每个位置都没有洞

H , W ≤ 3000 H,W\le 3000 H,W3000,洞的个数不超过 1 0 5 10^5 105


思路

动态规划 4 4 4 步:

  1. 状态的定义
  2. 转移的推导
  3. 边界的确定
  4. 结果的输出
状态的定义

我们不难想到设 f i , j f_{i, j} fi,j 表示以 ( i , j ) (i, j) (i,j) 正方形右下角的方案数。(这并不是本题的难点)

转移的推导(难点)

对于每一个 f i , j f_{i, j} fi,j,我们考虑他的推导:

  • 如果 A i , j A_{i, j} Ai,j 为洞,那么不会有合法的正方形,故 f i , j = 0 f_{i, j}=0 fi,j=0
  • 如果 A i , j A_{i, j} Ai,j 不为洞,那么考虑从三个方向转移:
    • 那么 f i , j = min ⁡ ( f i − 1 , j , f i , j − 1 , f i − 1 , j − 1 ) + 1 f_{i, j} = \min(f_{i - 1, j}, f_{i, j - 1}, f_{i - 1, j - 1}) + 1 fi,j=min(fi1,j,fi,j1,fi1,j1)+1,首先,这里的 + 1 +1 +1 就是会多出 i , j i, j i,j 自己作为一个正方形,对于取 min ⁡ \min min 的段落,就是通过 3 3 3 个点来确定出从 ( i , j ) (i, j) (i,j) 这个点可以向外延伸多长,下面有几个误区澄清一下:
    • 误区1:有些人会考虑取最大值
      • 这是不对的,考虑设 x 1 x_1 x1 为以 i − 1 , j i - 1, j i1,j 为右下角的合法正方形的最大边长, x 2 x_2 x2 为以 i − 1 , j − 1 i - 1, j - 1 i1,j1 为右下角的合法正方形的最大边长, x 3 x_3 x3 为以 i − 1 , j − 1 i - 1, j - 1 i1,j1 为右下角的合法正方形的最大边长。其实 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 就是我们的 f i − 1 , j , f i , j − 1 , f i − 1 , j − 1 f_{i - 1, j}, f_{i, j - 1}, f_{i - 1, j - 1} fi1,j,fi,j1,fi1,j1,因为如果边长为 x 1 x_1 x1的正方形是合法的,那么比 x 1 x_1 x1 边长小的正方形也一定合法,又因为我们取得是最大边长,所以就等同于 f i − 1 , j , f i , j − 1 , f i − 1 , j − 1 f_{i - 1, j}, f_{i, j - 1}, f_{i - 1, j - 1} fi1,j,fi,j1,fi1,j1。之后,我们考虑假设 x 1 x_1 x1 最大,那难道答案就是 x 1 x_1 x1吗?当然不是,因为 ( i − x 3 , j − x 3 ) (i - x_3, j -x_3) (ix3,jx3)这个点一定是有洞的,那么如果按我们的理解从 ( i − x 1 , j − x 1 + 1 ) (i-x_1, j-x_1 + 1) (ix1,jx1+1) ( i , j ) (i,j) (i,j)都是无洞的。但是 i − x 1 < i − x 3 i-x_1 < i-x_3 ix1<ix3 j − x 1 + 1 ≤ j − x 3 j-x_1 + 1\le j-x_3 jx1+1jx3,所以一定包含点 ( i − x 3 , j − x 3 ) (i - x_3, j -x_3) (ix3,jx3),即答案不是 x 1 x_1 x1。以此类推,我们就可以证明出答案其实是最小值
    • 误区2:有些人会认为可以不加 ( i − 1 , j − 1 ) (i-1,j-1) (i1,j1)
      • 这个很好反驳,给个例子就行了
        在这里插入图片描述
        假设,我们当前枚举到了 D 4 D4 D4,那么如果光通过 D 3 D3 D3 C 4 C4 C4 转移,方案数为 2 2 2,不过真的对吗?其实是错的因为 B 2 B2 B2 这个点并没有在状态之内,就会发生状态的遗漏。所以,必须加入 ( i − 1 , j − 1 ) (i-1,j-1) (i1,j1),这样才能保证,正方形区域内全是 1 1 1
边界的确定

貌似不需要

结果的输出

最终答案不难想,就是以每个 ( i , j ) (i, j) (i,j) 为正方形右下角的方案数之和,即 r e s = ∑ i = 1 n ∑ j = 1 m f i , j res=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}f_{i,j} res=i=1nj=1mfi,j

一首小诗总结一下

代码

#include <iostream>
#define int long long

using namespace std;

const int N = 3e3 + 10;

int n, m, k;
int a, b;
int mp[N][N], dp[N][N];

signed main()
{
	cin >> n >> m >> k;
	
	for (int i = 1; i <= k; i ++)
			cin >> a >> b, mp[a][b] = 1;
			
	int res =0 ;
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
		{
			dp[i][j] = min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
			if (mp[i][j])
				dp[i][j] = 0;
			res += dp[i][j];
		}
		
	cout << res << endl;
	
	return 0;
}

时间复杂度: O ( n m ) O(nm) O(nm)

恭喜你,成功战胜了 A B C 311 E − D e f e c t   f r e e   S q u a r e s \color{F9E55D}{ABC311E - Defect\ free\ Squares} ABC311EDefect free Squares,奖励继续看题~~~


第五战: C S E S − 1638   G r i d   P a t h s \color{97EF6A}{CSES-1638\ Grid\ Paths} CSES1638 Grid Paths

题目描述

题目大意

给出一个 n × n n\times n n×n 的网格,其中 * 表示当前点不可走,.表示当前点可走,每次只能向右或向左走,问从 ( 1 , 1 ) (1, 1) (1,1) 走到 ( n , n ) (n,n) (n,n) 的方案数,对 1 0 9 + 7 10^9+7 109+7 取模。


思路

动态规划莫过于 4 4 4 步:

  1. 状态的定义
  2. 转移的推导
  3. 边界的确定
  4. 结果的输出
状态的定义:

可以设 f i , j f_{i, j} fi,j 表示从 ( 1 , 1 ) (1,1) (1,1) 走到 ( i , j ) (i,j) (i,j) 的方案数。


转移的推导

比较简单,直接写吧:

f i , j = { f i , j + f i − 1 , j G i − 1 , j ≠ ∗ f i , j + f i , j − 1 G i , j − 1 ≠ ∗ f_{i,j}=\begin{cases} & f_{i,j}+f_{i-1,j} & G_{i-1,j}\ne*\\ & f_{i,j} + f_{i,j-1} & G_{i,j-1}\ne* \end{cases} fi,j={fi,j+fi1,jfi,j+fi,j1Gi1,j=Gi,j1=


边界的确定

f 1 , 1 = 1 f_{1,1}=1 f1,1=1


结果的输出

r e s = f n , n res=f_{n,n} res=fn,n

一首小诗总结一下

起点至坐标 ( i , j ) (i, j) (i,j),方案设为 f i , j f_{i, j} fi,j
转移先判能否转,之后再加方案数。
边界此时要确定,起点自身 1 1 1 方案。
输出终点方案数,天空巨响 A C AC AC


代码

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 1e3 + 10, mod = 1e9 + 7;

int n;
char g[N][N];
int f[N][N];

signed main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	cin >> n;

	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= n; j ++)
			cin >> g[i][j];

	if (g[1][1] != '*') f[1][1] = 1; //注意:如果第一个点是*就不能在往后推导了
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= n; j ++)
		{
			if (g[i][j] == '*') continue;
			int Way1 = f[i - 1][j], Way2 = f[i][j - 1];
			if (g[i - 1][j] == '*') Way1 = 0;
			if (g[i][j - 1] == '*') Way2 = 0;
			f[i][j] = (f[i][j] + Way1 + Way2) % mod;
		}

	cout << f[n][n] << endl;

	return 0;
}

时间复杂度: O ( n 2 ) O(n^2) O(n2)

恭喜您,成功战胜了 C S E S − 1638   G r i d   P a t h s \color{97EF6A}{CSES-1638\ Grid\ Paths} CSES1638 Grid Paths,奖励无:


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

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

相关文章

参与线上活动赢GLMR!在韩国和新加坡遇见Moonbeam

随着8月进入尾声&#xff0c;月圆人团圆的中秋节也已经近在眼前&#xff0c;凉爽的秋天将会为大地带来新的气象。而今年秋天对于区块链产业以及Moonbeam来说与以往不同&#xff0c;将是一个热闹且充满活动的季节。 9月初将会迎来韩国最大的区块链活动&#xff0c;韩国区块链周K…

M1 Pro 新芯片安装python2 方案汇总

前言&#xff1a;磨刀不误砍柴工&#xff0c;环境装好&#xff0c;才能打工。M1 Pro 新芯片安装python2 文章目录 方案一 docker 容器构造环境&#xff08;如果涉及本地两个仓库需要关联则不适用&#xff09;方案二 使用 pyenv &#x1f680; 作者简介&#xff1a;作为某云服务…

YAML详解及使用方法

YAML详解及使用方法 一、基本介绍二、数据类型2.1 纯量(scalars)/标量2.1.1 字符串2.1.2 保留换行(Newlines preserved)2.1.3 布尔值&#xff08;Boolean)2.1.4 整数&#xff08;Integer&#xff09;2.1.5 浮点数&#xff08;Floating Point&#xff09;2.1.6 空&#xff08;Nu…

WIN11右键菜单替换成WIN10右键菜单的办法

想必很多人已经都是使用上Win11的系统了。今天就来解决一个让人很无语的问题&#xff0c;就是这个win11的右键菜单。真的是太太太难用了。 能一步完成的操作&#xff0c;非要需要我多走一步。真的是麻了。 亲爱的Windows 11右键菜单&#xff0c;你的设计真是令人头疼。 那么我…

项目经理跨部门沟通的6个原则

大家好&#xff0c;我是老原。今天想和大家聊聊跨部门沟通。 你们在项目管理工作中&#xff0c;都是如何跨部门沟通&#xff0c;协调资源的&#xff1f; 项目经理80%的工作时间都是在沟通&#xff0c;一名优秀的项目经理&#xff0c;无疑是一个好的沟通者。 但不理解你的领导…

气象站的组成,有什么作用?

气象站的含义&#xff1a; 气象站是监测环境要素的仪器&#xff0c;比如&#xff1a;空气温度、空气湿度、风速、风向、大气压力、光照度等。气象站对环境要素的监测是通过不同传感器实现的&#xff0c;各个传感器既可以单独使用&#xff0c;也可以搭配使用&#xff0c;监测到…

董明珠怒斥员工「吃着碗里看着锅里」,如何看待?

导言&#xff1a; 最近&#xff0c;格力电器董事长董明珠因怒斥员工「吃着碗里看着锅里」的言论引起了广泛关注。这一事件激起了公众对职业素养和领导方式的讨论。本文将从职业素养的视角出发&#xff0c;探讨如何看待董明珠的怒斥员工事件。 领导者的压力与情绪管理 作为一位顶…

NCCoE发布“向后量子密码学迁移”项目进展情况说明书

近日&#xff0c;NIST下属的国家网络安全中心&#xff08;NCCoE&#xff09;发布了一份向后量子密码学迁移&#xff08;Migration to Post-Quantum Cryptography&#xff09;项目情况说明书。该文档简要概述了向后量子密码学迁移项目的背景、目标、挑战、好处和工作流程&#x…

2023年高教社杯 国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

使用Gitea自建仓库 并配置git上传

使用Gitea自建仓库 并配置git上传 使用 Docker 安装 | Gitea Documentation 1. 安装Docker 2. 使用Docker Compose快速安装 在安装目录下创建config 和 data两个文件夹 以下是我的配置&#xff0c;和官网提供的大差不差 version: "3"networks:gitea:external: …

c++入门——变量

专栏简介&#xff1a;为什么我要重新介绍c的相关知识&#xff0c;在此之前&#xff0c;我对于c的了解也仅仅是在表面。而在后来与c慢慢的接触中&#xff0c;c编程语言越来越让我觉得深奥&#xff0c;所以还是想要重新开创一个专栏来介绍c。对于c的介绍&#xff0c;本专栏会先介…

WebAssembly 在云原生中的实践指南

1 WebAssembly 介绍 WebAssembly&#xff08;Wasm&#xff09;是一种通用字节码技术&#xff0c;它可以将其他编程语言&#xff08;如 Go、Rust、C/C 等&#xff09;的程序代码编译为可在浏览器环境直接执行的字节码程序。 WebAssembly 的初衷之一是解决 JavaScript 的性能问…

1688API技术解析,实现按关键字搜索1688接口

要实现按关键字搜索1688商品&#xff0c;您可以使用1688提供的API来完成。下面是对1688 API的技术解析&#xff1a; 1. 注册成为1688开发者&#xff1a; 首先&#xff0c;您需要在1688开放平台上注册成为开发者&#xff0c;并创建一个应用以获取API访问权限。 2. 获取API访…

低代码是什么?能做什么?

2014 年全球权威咨询机构 Forrester 在报告中首次引入了低代码的概念&#xff0c;放眼彼时的中国市场&#xff0c;低代码这一名词还鲜为人知。随着国家积极推动数字化发展&#xff0c;越来越多的企业投入到了数字化经济的建设中&#xff0c;低代码也在这样的大环境中快速成长。…

JVM ZGC垃圾收集器

ZGC垃圾收集器 ZGC&#xff08;“Z”并非什么专业名词的缩写&#xff0c;这款收集器的名字就叫作Z Garbage Collector&#xff09;是一款在JDK 11中新加入的具有实验性质[1]的低延迟垃圾收集器&#xff0c;是由Oracle公司研发的。 ZGC收集器是一款基于Region内存布局的&#…

【RS485 - 总线冲突】

最近写了一个小小的串口通信程序&#xff0c;逻辑上感觉没什么问题&#xff0c;但就是数据与设定值不对。最后发现应该是总线冲突的问题。 在RS485通信中&#xff0c;如果在接收完数据后立即发送数据&#xff0c;可能会引发总线冲突问题。这是因为在RS485通信中&#xff0c;设…

经典问题解析四

关于动态内存分配 new 和 malloc 的区别是什么&#xff1f; delete 和 free 的区别是什么&#xff1f; new 关键字与 malloc 函数的区别 new 关键字是 C 的一部分 malloc 是由 C 库函数提供的函数 new 是以具体类型为单位进行内存分配 malloc 以字节为单位进行内存分配 …

webrtc-m79-msvc编译H264

0 写在前面 本文主要参考&#xff1a;webrtc 4577版本vs编译_tusong86的博客-CSDN博客 感谢作者的付出&#xff1b; 1 编译参数 powershell运行&#xff1a; // debug 需要编译参数 enable_iterator_debuggingtrue gn gen h264-debug-m79 --argsis_debugtrue use_lldfalse …

电脑日历怎么添加日程?如何在电脑上设置日程提醒?

在办公室使用电脑办公时&#xff0c;我们需要在电脑日历上添加日程&#xff0c;以便及时提醒自己工作中的重要事件。比如&#xff0c;我们需要安排明天的会议时间、发送重要文件的截止日期&#xff0c;或者是提醒自己去参加一个重要的客户洽谈会。这些日程安排对于我们的工作效…

财报解读:上半年GMV超50亿元,交个朋友瞄准了更广阔的市场

于今年7月曲线上市的交个朋友交出了首份“答卷”。 近日&#xff0c;交个朋友控股披露了2023年上半年财报&#xff0c;营收4.33亿元&#xff0c;同比增长215.5%&#xff1b;经调整净利润约9463.5万元&#xff0c;同比暴增1798%&#xff1b;全网合计GMV超50亿元。 图源&#xf…