【每日一題】【前綴和優化】【前/后綴最值】牛客練習賽139 B/C題 大衛的密碼 (Hard Version) C++

牛客練習賽139 B題 大衛的密碼 (Easy Version)
牛客練習賽139 C題 大衛的密碼 (Hard Version)

大衛的密碼

題目背景

牛客練習賽139

題目描述

給定一個 n × m n\times m n×m的網格圖,我們使用 ( i , j ) (i,j) (i,j)表示網格中從上往下數第 i i i行和從左往右數第 j j j列的單元格。左上角為 ( 1 , 1 ) (1,1) (1,1),右下角為 ( n , m ) (n,m) (n,m),每個格子包含一個整數價值,使用 a i , j a_{i,j} ai,j?表示。
一個光標在上面移動,從 ( s , 1 ) (s,1) (s,1)出發,每次可以向右或者向下移動,每個格子至多經過一次。當光標移動到 ( n , i ) ( 1 ≤ i ≤ m ) (n,i)(1\le i \le m) (n,i)(1im)格子,也就是最后一行的某個格子時,繼續向下移動則會到達 ( 1 , i ) (1,i) (1,i)格子。大衛需要移動光標到達 ( t , m ) (t,m) (t,m),求最終大衛能獲取的最大價值和。
注意本題的時間限制。本題數據量較大,我們建議您選取較快的讀入方式。

輸入格式

第一行輸入四個整數 n , m , s , t ( 1 ≤ n , m ≤ 2 × 10 3 ; 1 ≤ s , t ≤ n ) n, m,s,t(1\le n ,m \le 2\times10^3;1\le s,t \le n) n,m,s,t(1n,m2×103;1s,tn)
注:簡單版本的范圍是 : 1 ≤ n , m ≤ 500 1\le n ,m \le 500 1n,m500
此后 n n n 行,第 i i i 行輸入 m m m個整數 a i , 1 , a i , 2 , . . . , a i , m ( ? 5 × 10 4 ≤ a i , j ≤ 5 × 10 4 ) a_{i,1},a_{i,2},...,a_{i,m}(-5\times 10^4\le a_{i,j} \le 5\times 10^4) ai,1?,ai,2?,...,ai,m?(?5×104ai,j?5×104),表示一個格子的價值

輸出格式

在一行上輸出一個整數,表示大衛能獲取的最大價值和。

樣例 #1

樣例輸入 #1

3 3 1 2
1 2 3
4 5 6
7 8 9

樣例輸出 #1

38
說明

小紅失去向上走的能力,消除 ( 1 , 3 ) (1,3) (1,3)處障礙,從起點到終點的最小步數為 6 6 6

樣例 #2

樣例輸入 #2

5 5 1 5
6 10 4 10 6
-6 6 10 3 -1
-10 9 -6 -10 10
-3 8 4 5 6
-5 -8 2 4 8

樣例輸出 #2

100

做題要點

  1. 每次可以向右或者向下移動(說明不能往回走)
  2. 每個格子至多經過一次
  3. 時間給的是2s
  4. 到某一列的最后一行在往下就到該列的第一行

做題思路

先考慮簡單版本

首先因為 1 ≤ n , m ≤ 500 1\le n ,m \le 500 1n,m500,所以哪怕是 O ( n 3 ) / O ( m × n 2 ) / O ( n × m 2 ) O(n^3) / O(m \times n^2) / O(n \times m^2) O(n3)/O(m×n2)/O(n×m2)都可以考慮

逆向思考

這里設 d p i , j dp_{i,j} dpi,j?表示從起點走到 ( i , j ) (i,j) (i,j)點的大衛能獲取的最大價值和。
從某一點 ( i , j ) (i,j) (i,j)考慮,那么答案一定是
d p i , j = { max ? ( d p i , j ? 1 , d p i ? 1 , j ) + a i , j , ( i ≠ s , j ≠ 1 ) d p i , j = a i , j , ( i = s , j = 1 ) dp_{i,j} = \begin{cases} \max{(dp_{i,j-1},dp_{i-1,j})} + a_{i,j} , (i\neq s , j \neq 1) \\ dp_{i,j} = a_{i,j} ,(i = s , j = 1)\end{cases} dpi,j?={max(dpi,j?1?,dpi?1,j?)+ai,j?,(i=s,j=1)dpi,j?=ai,j?,(i=s,j=1)?
加上記憶化搜索后dfs代碼:

int dfs(int i,int j,int k){if(vis[i][j])return dp[i][j];vis[i][j] = true;if(i == s && j == 1)return dp[i][j] = a[i][j];int k1=-inf,k2=-inf;if(j != 1)k1=dfs(i,j_f(j),0);if(k < n-1)k2 = max(k2,dfs(i_f(i),j,k+1));return dp[i][j]=max(k1,k2) + a[i][j];
}

但是注意到某一列的最后一行在往下就到該列的第一行,所以就會出現一個環,導致遞推式無法完全計算。
注意: d p i , j = max ? ( d p i , j ? 1 , d p i ? 1 , j ) + a i , j dp_{i,j} = \max{(dp_{i,j-1},dp_{i-1,j})} + a_{i,j} dpi,j?=max(dpi,j?1?,dpi?1,j?)+ai,j?
那么 d p i , j dp_{i,j} dpi,j?的答案依賴于 d p i , j ? 1 dp_{i,j-1} dpi,j?1? d p i ? 1 , j dp_{i-1,j} dpi?1,j?,如果只關注后面的那個依賴關系
那么就會有
d p 2 , j dp_{2,j} dp2,j?依賴于 d p 1 , j dp_{1,j} dp1,j?
d p 1 , j dp_{1,j} dp1,j?依賴于 d p m , j dp_{m,j} dpm,j?
d p m , j dp_{m,j} dpm,j?依賴于 d p m ? 1 , j dp_{m-1,j} dpm?1,j?
d p m ? 1 , j dp_{m-1,j} dpm?1,j?依賴于 d p m ? 2 , j dp_{m-2,j} dpm?2,j?

d p 3 , j dp_{3,j} dp3,j?依賴于 d p 2 , j dp_{2,j} dp2,j?
最后就會發現 d p i , j dp_{i,j} dpi,j?依賴于自己 d p i , j dp_{i,j} dpi,j?( j ≠ 1 j\neq 1 j=1)。如果依賴符號用有向箭頭連接成一個有向圖,就會發現是一個環。所以此寫法欠缺考慮。

注:如果不考慮記憶化搜索優化,會TLE

int dfs(int i,int j,int k){if(i == s && j == 1)return a[i][j];int k1=-inf,k2=-inf;if(j != 1)k1=dfs(i,j_f(j),0);if(k < n-1)k2 = max(k2,dfs(i_f(i),j,k+1));return max(k1,k2) + a[i][j];
}

正向思考

但剛剛的逆向思考中,會發現除了第一列的 d p i , 1 dp_{i,1} dpi,1?都得到了答案,其他都是未知的或錯解。
其根本原因是 ( s , 1 ) (s,1) (s,1)的點是起點, d p s , 1 dp_{s,1} dps,1?不依賴于(其他)未知的量,更不依賴于本身。
至此第一列的答案都是可以由 d p s , 1 dp_{s,1} dps,1?推出的定值
那假設從第一行第一列往第一行第二列走。并且設其 d p 1 , 2 = d p 1 , 1 + a 1 , 2 dp_{1,2} = dp_{1,1} + a_{1,2} dp1,2?=dp1,1?+a1,2?。這樣一來就達到了破環的效果,再用第一列的方法,一直向下推,可以推出其中一組 d p i , 2 dp_{i,2} dpi,2?解。
同理如果從第二行第一列從第二行第二列走。并且設其 d p 2 , 2 = d p 2 , 1 + a 2 , 2 dp_{2,2} = dp_{2,1} + a_{2,2} dp2,2?=dp2,1?+a2,2?。這樣一來也就達到了破環的效果,再用第一列的方法,一直向下推,可以推出又一組 d p i , 2 dp_{i,2} dpi,2?解。

同理如果從第 n n n行第一列從第 n n n行第二列走。并且設其 d p n , 2 = d p n , 1 + a n , 2 dp_{n,2} = dp_{n,1} + a_{n,2} dpn,2?=dpn,1?+an,2?。這樣一來也就達到了破環的效果,再用第一列的方法,一直向下推,可以推出又一組 d p i , 2 dp_{i,2} dpi,2?解。

然后在 d p i , 2 dp_{i,2} dpi,2? 解組( n n n組解) 中選擇最大的值當作 d p i , 2 dp_{i,2} dpi,2?的解即可
然后第二列的答案都是定值
以此類推直到最后一列
由此我們得到了第二個遞推式:
f d p k , i , j fdp_{k,i,j} fdpk,i,j?表示從第 k k k行第 j ? 1 j-1 j?1列往第 k k k行第 j j j列走后推出的一組解,并且設其 f d p k , k , j = d p k , j ? 1 + a k , j fdp_{k,k,j} = dp_{k,j-1} + a_{k,j} fdpk,k,j?=dpk,j?1?+ak,j?
并且推出一組解的遞推式為:
f d p k , i , j = f d p k , i ? 1 , j + a i , j , ( i ≠ k ) fdp_{k,i,j} = fdp_{k,i-1,j} + a_{i,j} , (i \neq k) fdpk,i,j?=fdpk,i?1,j?+ai,j?,(i=k)
得到所以 m m m組解后,真正的答案選取最大的即可:
d p i , j = max ? k = 1 n ( f d p k , i , j ) dp_{i,j} = \displaystyle\max_{k=1}^n{(fdp_{k,i,j})} dpi,j?=k=1maxn?(fdpk,i,j?)
由第一列為定值推出第二列的值,可以將第二列看為定值推第三列,以此類推。
換句話說由第一列為定值推出第二列的值其實是枚舉第二列的“起點”

#define RIP(i,j,k) for(int (i) = (j) ; (i) < (k) ; ++ i)
inline int f_i(int x){return x + 1 == n + 1 ? 1 : x + 1;}//往下
inline int i_f(int x){return x - 1 == 0 ? n : x - 1; }//往上
int ans[N][N];
bool vis[N][N]
RIP(j,1,m+1){for(int i = s ; !vis[i][j] ; i = f_i(i)){//枚舉起點/轉移行int ansi[N];//fdpvis[i][j] = true;ansi[i] = a[i][j] + ans[i][j-1];for(int k = f_i(i); k != i ; k = f_i(k)){ansi[k] = a[k][j] + ansi[i_f(k)];//fdp[i]  = fdp[i-1] + a[i][j]}//得到一組答案RIP(k,1,n+1)ans[k][j] = max(ans[k][j] , ansi[k]);//更新這一組答案if(j==1)break;//第一列的起點就一個}}

注意第一列的起點就一個!
總時間復雜度為 O ( m × n 2 ) O(m\times n^2) O(m×n2),在簡單版本可以通過,但困難版本數據范圍放大后就會TLE

如果要考慮通過困難版本就需要優化
將遞推式 d p i , j = max ? k = 1 n ( f d p k , i , j ) dp_{i,j} = \displaystyle\max_{k=1}^n{(fdp_{k,i,j})} dpi,j?=k=1maxn?(fdpk,i,j?)展開就會有
d p i , j = max ? k = 1 n d p k , j ? 1 + ∑ o = k i a o , j dp_{i,j} = \displaystyle\max_{k=1}^n dp_{k,j-1} + \displaystyle\sum_{o=k}^i a_{o,j} dpi,j?=k=1maxn?dpk,j?1?+o=ki?ao,j?
其中 ∑ o = k i a o , j \displaystyle\sum_{o=k}^i a_{o,j} o=ki?ao,j?表示從第 k k k行第 j j j列一直向下走直到第 i i i行第 j j j列的路徑上的權值和。
那么重點是每次算這個路徑權值和的時候是最里面的一層循環,并且還要求最大值。

for(int k = f_i(i); k != i ; k = f_i(k)){ansi[k] = a[k][j] + ansi[i_f(k)];//fdp[i]  = fdp[i-1] + a[i][j]}//得到一組答案RIP(k,1,n+1)ans[k][j] = max(ans[k][j] , ansi[k]);//更新這一組答案

這時候如果路徑權值和能立馬得到那么循環常數就可能會減少。如果把這一列數字單獨拿出來當作一個數組 b i b_i bi?,其實就是要求 ∑ i = l r b i \displaystyle\sum_{i=l}^r b_i i=lr?bi?
相當于多次要求區間和,我們可以考慮前綴和預處理優化。
p r e n = ∑ i = 1 n b n = ∑ i = 1 n a n , j ( j 為固定值 ) pre_n = \displaystyle\sum_{i=1}^n b_n = \displaystyle\sum_{i=1}^n a_{n,j} (j為固定值) pren?=i=1n?bn?=i=1n?an,j?(j為固定值)
因為是一列一列考慮的所以j為固定值。相當于原本是:
p r e n , j = ∑ i = 1 n a n , j pre_{n,j} =\displaystyle\sum_{i=1}^n a_{n,j} pren,j?=i=1n?an,j? “滾動化”
所以以下式子默認 p r e n = p r e n , j pre_n = pre_{n,j} pren?=pren,j?

接下來改寫遞推式,繼續展開
d p i , j = max ? d p k , j ? 1 + { p r e i ? p r e k ? 1 , i ≥ k p r e n ? p r e k ? 1 + p r e i , i < k dp_{i,j} = \max dp_{k,j-1} + \begin{cases}pre_i - pre_{k-1} , i \ge k \\ pre_n - pre_{k-1} + pre_i , i \lt k \end{cases} dpi,j?=maxdpk,j?1?+{prei??prek?1?,ikpren??prek?1?+prei?,i<k?

將預處理后的共同已知量提到 max ? \max max外面得
d p i , j = p r e i + max ? d p k , j ? 1 + { ? p r e k ? 1 , i ≥ k p r e n ? p r e k ? 1 , i < k dp_{i,j} = pre_i + \max dp_{k,j-1} + \begin{cases} - pre_{k-1} , i \ge k \\ pre_n - pre_{k-1} , i \lt k \end{cases} dpi,j?=prei?+maxdpk,j?1?+{?prek?1?,ikpren??prek?1?,i<k?

然而如果每個 i i i都枚舉一遍 k k k時間復雜度依舊是 O ( m × n 2 ) O(m\times n^2) O(m×n2),這時候就需要預處理 k k k i i i的關系
假設 G i G_i Gi?表示 max ? d p k , j ? 1 ? p r e k ? 1 , i ≥ k \max dp_{k,j-1} - pre_{k-1}, i \ge k maxdpk,j?1??prek?1?,ik
假設 L i L_i Li?表示 max ? d p k , j ? 1 + p r e n ? p r e k ? 1 , i < k \max dp_{k,j-1} + pre_n - pre_{k-1} , i \lt k maxdpk,j?1?+pren??prek?1?,i<k
那么原遞推式就能寫成
d p i , j = p r e i + max ? ( G i , L i ) dp_{i,j} = pre_i + \max (G_i,L_i) dpi,j?=prei?+max(Gi?,Li?)
遞推式就是只用枚舉 i i i
那么問題就在于如何用線性時間復雜度預處理解出 G i G_i Gi? L i L_i Li?
從式子上發現 G i G_i Gi?只與 k k k有關。也就是說
G 1 = d p 1 , j ? 1 ? p r e 0 G_{1} = dp_{1,j-1} - pre_{0} G1?=dp1,j?1??pre0? ,(相當于 k k k只能選 { 1 } \set{1} {1})
G 2 = max ? ( d p 1 , j ? 1 ? p r e 0 , d p 2 , j ? 1 ? p r e 1 ) = max ? ( G 1 , d p 2 , j ? 1 ? p r e 1 ) G_{2} = \max(dp_{1,j-1} - pre_{0} , dp_{2,j-1} - pre_{1}) = \max(G_1,dp_{2,j-1} - pre_{1}) G2?=max(dp1,j?1??pre0?,dp2,j?1??pre1?)=max(G1?,dp2,j?1??pre1?) ,(相當于 k k k只能選 { 1 , 2 } \set{1,2} {1,2})
同理 G 3 = max ? ( G 2 , d p 3 , j ? 1 ? p r e 2 ) G_3 = \max{(G_2 , dp_{3,j-1} - pre_{2})} G3?=max(G2?,dp3,j?1??pre2?)
以此類推 G i = max ? ( G i ? 1 , d p i , j ? 1 ? p r e i ? 1 ) G_i = \max{(G_{i-1} , dp_{i,j-1} - pre_{i-1})} Gi?=max(Gi?1?,dpi,j?1??prei?1?)

L i L_i Li?只與 k k k有關,
L n = ? i n f ( 無 ) L_n = -inf (無) Ln?=?inf() , (相當于 k k k沒得選)
L n ? 1 = d p n , j ? 1 + p r e n ? p r e n ? 1 L_{n-1} = dp_{n,j-1} + pre_{n} - pre_{n-1} Ln?1?=dpn,j?1?+pren??pren?1?,(相當于 k k k只能選 { n } \set{n} {n})
同理 L n ? 2 = max ? ( L n ? 1 , d p n ? 1 , j ? 1 + p r e n ? p r e n ? 2 ) L_{n-2} = \max{(L_{n-1},dp_{n-1,j-1} + pre_{n} - pre_{n-2})} Ln?2?=max(Ln?1?,dpn?1,j?1?+pren??pren?2?)
以此類推 L i = max ? ( L i + 1 , d p i + 1 , j ? 1 + p r e n ? p r e i ) L_i = \max{(L_{i+1} , dp_{i+1,j-1} + pre_n - pre_{i})} Li?=max(Li+1?,dpi+1,j?1?+pren??prei?)

RIP(j,1,m+1){int pre[N],L[N],G[N];RIP(i,0,n+1){pre[i] = 0;L[i] = G[i] = -inf;}RIP(i,1,n+1)pre[i] = pre[i-1] + a[i][j];RIP(i,1,n+1)G[i] = max(G[i-1],ans[i][j-1]-pre[i-1]);L[n] = -inf;L[n-1]=ans[n][j-1]+pre[n]-pre[n-1];rRIP(i,n-2,1)L[i]= max(L[i+1],ans[i+1][j-1] + pre[n] - pre[i]);RIP(i,1,n+1)ans[i][j] = pre[i] + max(L[i],G[i]);}

最后用上起點,和之前的思路一樣。第一列只有一個起點,也就是說我們要保證
d p s , 0 = 0 且 d p s , 0 > > d p i , 0 ( i ≠ s ) dp_{s,0} = 0 且 dp_{s,0} >> dp_{i,0} (i\neq s) dps,0?=0dps,0?>>dpi,0?(i=s)保證不能選到(有)從非起點行第0列轉移到第一列的任意行的情況
所以設置 d p i , 0 = ? i n f ( i ≠ s ) dp_{i,0} = -inf (i\neq s) dpi,0?=?inf(i=s)

RIP(i,1,n+1)ans[i][0]=-inf;ans[s][0]=0;

時間復雜度為 O ( m × n ) O(m\times n) O(m×n)

代碼

#include <bits/stdc++.h>
#define int long long
#define RIP(i,j,k) for(int (i) = (j) ; (i) < (k) ; ++ i)
#define rRIP(i,j,k) for(int (i) = (j) ; (i) >= (k) ; -- i)
#define all(x) x.begin(),x.end()
#define endy {cout << "YES" << '\n'; return; }
#define endn {cout << "NO" << '\n'; return; }
#define endx(x) {cout << (x) << '\n'; return; }
#define conti(x) {cout << (x) << '\n';continue;}
#define IOS std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);
using namespace std;
using i128 = __int128;
using pii = pair<int,int>;
using tiii = tuple<int,int,int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vii = vector<pii>;
using mii = map<int,int>;
const int N = 2e3+10;
const int mod = 1e9 + 7;
const int MID = 2e4+10;
const int inf = 0x3f3f3f3f3f3f3f3f;
int n = 1 , m  = 100 , s , t;int a[N][N];
int ans[N][N];
int read() {int x = 0, w = 1;char ch = 0;while (ch < '0' || ch > '9') {if (ch == '-') w = -1;ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + (ch - '0');ch = getchar();}return x * w;
}
inline int f_j(int x){return x + 1 == m + 1 ? 1 : x + 1; }
inline int j_f(int x){return x - 1 == 0 ? m : x - 1; }
inline int f_i(int x){return x + 1 == n + 1 ? 1 : x + 1;}
inline int i_f(int x){return x - 1 == 0 ? n : x - 1; }
void solve(){n = read() , m = read() , s = read() , t = read();RIP(i,1,n+1)RIP(j,1,m+1){a[i][j] = read();ans[i][j] = -inf;}RIP(i,1,n+1)ans[i][0]=-inf;ans[s][0]=0;RIP(j,1,m+1){int pre[N],L[N],G[N];RIP(i,0,n+1){pre[i] = 0;L[i] = G[i] = -inf;}RIP(i,1,n+1)pre[i] = pre[i-1] + a[i][j];RIP(i,1,n+1)G[i] = max(G[i-1],ans[i][j-1]-pre[i-1]);L[n] = -inf;L[n-1]=ans[n][j-1]+pre[n]-pre[n-1];rRIP(i,n-2,1)L[i]= max(L[i+1],ans[i+1][j-1] + pre[n] - pre[i]);RIP(i,1,n+1)ans[i][j] = pre[i] + max(L[i],G[i]);}cout << ans[t][m];
}
signed main(){//IOS//int T;cin >> T;while(T--)solve();
}

簡單版本

#include <bits/stdc++.h>
#define int long long
#define RIP(i,j,k) for(int (i) = (j) ; (i) < (k) ; ++ i)
#define rRIP(i,j,k) for(int (i) = (j) ; (i) >= (k) ; -- i)
#define all(x) x.begin(),x.end()
#define endy {cout << "YES" << '\n'; return; }
#define endn {cout << "NO" << '\n'; return; }
#define endx(x) {cout << (x) << '\n'; return; }
#define conti(x) {cout << (x) << '\n';continue;}
#define IOS std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);
using namespace std;
using i128 = __int128;
using pii = pair<int,int>;
using tiii = tuple<int,int,int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vii = vector<pii>;
using mii = map<int,int>;
const int N = 2e3+10;
const int mod = 1e9 + 7;
const int MID = 2e4+10;
const int inf = 0x3f3f3f3f3f3f3f3f;
int n = 1 , m  = 100 , s , t;int a[N][N];
int ans[N][N];
bool vis[N][N];
int pre[N][N];
int read() {int x = 0, w = 1;char ch = 0;while (ch < '0' || ch > '9') {if (ch == '-') w = -1;ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + (ch - '0');ch = getchar();}return x * w;
}
inline int f_j(int x){return x + 1 == m + 1 ? 1 : x + 1; }
inline int j_f(int x){return x - 1 == 0 ? m : x - 1; }
inline int f_i(int x){return x + 1 == n + 1 ? 1 : x + 1;}
inline int i_f(int x){return x - 1 == 0 ? n : x - 1; }
void solve(){n = read() , m = read() , s = read() , t = read();RIP(i,1,n+1)RIP(j,1,m+1){a[i][j] = read();ans[i][j] = -inf;}RIP(j,1,m+1)RIP(i,1,n+1)pre[i][j] = pre[i-1][j] + a[i-1][j];RIP(j,1,m+1){for(int i = s ; !vis[i][j] ; i = f_i(i)){int ansi[N];vis[i][j] = true;ansi[i] = a[i][j] + ans[i][j-1];for(int k = f_i(i); k != i ; k = f_i(k)){ansi[k] = a[k][j] + ansi[i_f(k)];}RIP(k,1,n+1)ans[k][j] = max(ans[k][j] , ansi[k]);if(j==1)break;}}cout << ans[t][m];
}
signed main(){//IOS//int T;cin >> T;while(T--)solve();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82324.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件夾圖像批處理教程

前言 因為經常對圖像要做數據清洗&#xff0c;又很費時間去重新寫一個&#xff0c;我一直在想能不能寫一個通用的腳本或者制作一個可視化的界面對文件夾圖像做批量的修改圖像大小、重命名、劃分數據訓練和驗證集等等。這里我先介紹一下我因為寫過的一些腳本&#xff0c;然后我…

【Unity實戰筆記】第二十四 · 使用 SMB+Animator 實現基礎戰斗系統

轉載請注明出處&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/146409453 作者&#xff1a;CSDN|Ringleader| 1 結構 1.1 狀態機 1.2 SMB 2 代碼實現 2.1 核心控制 Player_Base_SMB 繼承 StateMachineBehaviour &#xff0c;控制變量初始…

Python虛擬環境再PyCharm中自由切換使用方法

Python開發中的環境隔離是必不可少的步驟,通過使用虛擬環境可以有效地管理不同項目間的依賴,避免包沖突和環境污染。虛擬環境是Python官方提供的一種獨立運行環境,每個項目可以擁有自己單獨的環境,不同項目之間的環境互不影響。在日常開發中,結合PyCharm這樣強大的IDE進行…

大模型智能體入門掃盲——基于camel的概述

前言 本篇博客想帶讀者進行一個智能體入門掃盲&#xff0c;了解基礎知識&#xff0c;為什么用camel呢&#xff0c;因為小洛發現它們文檔對這種智能體的基本組件介紹得很全面深入。 基礎概念 agent 一個典型的agent智能體包含三個核心部分&#xff1a; 感知模塊&#xff1…

目標檢測 RT-DETR(2023)詳細解讀

文章目錄 主干網絡&#xff1a;Encoder&#xff1a;不確定性最小Query選擇Decoder網絡&#xff1a; 將DETR擴展到實時場景&#xff0c;提高了模型的檢測速度。網絡架構分為三部分組成&#xff1a;主干網絡、混合編碼器、帶有輔助預測頭的變換器編碼器。具體來說&#xff0c;先利…

DeepSeek 賦能數字農業:從智慧種植到產業升級的全鏈條革新

目錄 一、數字農業的現狀與挑戰二、DeepSeek 技術解析2.1 DeepSeek 的技術原理與優勢2.2 DeepSeek 在人工智能領域的地位與影響力 三、DeepSeek 在數字農業中的應用場景3.1 精準種植決策3.2 病蟲害監測與防治3.3 智能灌溉與施肥管理3.4 農產品質量追溯與品牌建設 四、DeepSeek …

<uniapp><vuex><狀態管理>在uniapp中,如何使用vuex實現數據共享與傳遞?

前言 本專欄是基于uniapp實現手機端各種小功能的程序&#xff0c;并且基于各種通訊協議如http、websocekt等&#xff0c;實現手機端作為客戶端&#xff08;或者是手持機、PDA等&#xff09;&#xff0c;與服務端進行數據通訊的實例開發。 發文平臺 CSDN 環境配置 系統&…

高速串行差分信號仿真分析及技術發展挑戰續

7.3 3.125Gbps 差分串行信號設計實例仿真分析 7.3.1 設計用例說明 介紹完 Cadence 系統本身所具有的高速差分信號的仿真分析功能之后&#xff0c;我們以一個實例來說明 3.125Gbps 以下的高速差分系統的仿真分析方法。 在網上下載的設計文件“Booksi_Demo_Allegro160_Finishe…

【Golang】部分語法格式和規則

1、時間字符串和時間戳的相互轉換 func main() {t1 : int64(1546926630) // 外部傳入的時間戳&#xff08;秒為單位&#xff09;&#xff0c;必須為int64類型t2 : "2019-01-08 13:50:30" // 外部傳入的時間字符串//時間轉換的模板&#xff0c;golang里面只能是 &quo…

第十六章:數據治理之數據架構:數據模型和數據流轉關系

本章我們說一下數據架構&#xff0c;說到數據架構&#xff0c;就很自然的想到企業架構、業務架構、軟件架構&#xff0c;因為個人并沒有對這些內容進行深入了解&#xff0c;所以這里不做比對是否有相似或者共通的地方&#xff0c;僅僅來說一下我理解的數據架構。 1、什么是架構…

Day126 | 靈神 | 二叉樹 | 層數最深的葉子結點的和

Day126 | 靈神 | 二叉樹 | 層數最深的葉子結點的和 1302.層數最深的葉子結點的和 1302. 層數最深葉子節點的和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 這道題用層序遍歷的思路比較好想&#xff0c;就把每層的都算一下&#xff0c;然后返回最后一層的和就…

PCIE 4.0 vs PCIE 5.0固態硬盤——區別、科普與選購場景全解析

隨著數字內容和高性能計算需求的爆發&#xff0c;固態硬盤&#xff08;SSD&#xff09;已成為PC、游戲主機和工作站不可或缺的核心硬件。面對市面上層出不窮的新一代SSD產品&#xff0c;大家最常見的一個疑惑&#xff1a;**PCIe 4.0和PCIe 5.0固態硬盤&#xff0c;到底有啥區別…

vue pinia 獨立維護,倉庫統一導出

它允許您跨組件/頁面共享狀態 持久化 安裝依賴pnpm i pinia-plugin-persistedstate 將插件添加到 pinia 實例上 pinia獨立維護 統一導出 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia creat…

Dify源碼學習

文章目錄 1 大模型基本原理1.1 model_context_tokens、max_tokens和prompt_tokens1.1.1 三者之間的關系1.1.2 總結對比 2 Dify源代碼2.0 前后端代碼跑起來【0】準備開發環境【1】下載代碼【2】運行后端&#xff08;1&#xff09;Start the docker-compose stack&#xff08;2&a…

連接表、視圖和存儲過程

1. 視圖 1.1. 視圖的概念 視圖&#xff08;View&#xff09;&#xff1a;虛擬表&#xff0c;本身不存儲數據&#xff0c;而是封裝了一個 SQL 查詢的結果集。 用途&#xff1a; 只顯示部分數據&#xff0c;提高數據訪問的安全性。簡化復雜查詢&#xff0c;提高復用性和可維護…

微信小程序中,解決lottie動畫在真機不顯示的問題

api部分 export function getRainInfo() {return onlineRequest({url: /ball/recruit/getRainInfo,method: get}); }data存儲json數據 data&#xff1a;{rainJson:{} }onLoad方法獲取json數據 onLoad(options) {let that thisgetRainInfo().then((res)>{that.setData({r…

從加密到信任|密碼重塑車路云一體化安全生態

目錄 一、密碼技術的核心支撐 二、典型應用案例 三、未來發展方向 總結 車路云系統涉及海量實時數據交互&#xff0c;包括車輛位置、傳感器信息、用戶身份等敏感數據。其安全風險呈現三大特征&#xff1a; 開放環境威脅&#xff1a;V2X&#xff08;車與萬物互聯&#xff0…

光譜相機在地質勘測中的應用

一、?礦物識別與蝕變帶分析? ?光譜特征捕捉? 通過可見光至近紅外&#xff08;400-1000nm&#xff09;的高光譜分辨率&#xff08;可達3.5nm&#xff09;&#xff0c;精確識別礦物的“光譜指紋”。例如&#xff1a; ?銅礦?&#xff1a;在400-500nm波段反射率顯著低于圍…

理論篇三:如何編寫自定義的Webpack Loader或Plugin插件

在 Webpack 中,自定義 Loader 和 Plugin 是擴展構建能力的關鍵方式。以下是它們的實現方法和核心邏輯,通過代碼示例和步驟拆解幫助你快速掌握。 一、自定義 Loader 1. Loader 的本質 作用:將非 JS 文件轉換為 Webpack 能處理的模塊。特點:純函數,接收源文件內容,返回處理…

【算法】力扣體系分類

第一章 算法基礎題型 1.1 排序算法題 1.1.1 冒泡排序相關題 冒泡排序是一種簡單的排序算法&#xff0c;它重復地走訪過要排序的數列&#xff0c;一次比較兩個元素&#xff0c;如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換&#xff0c…