單調佇列 JZOJ 1753 鍛鍊身體

2022-06-12 22:12:13 字數 1247 閱讀 6415

乙個\(n*m\)的矩陣,有些格仔不能經過,有\(k\)個時段,

要麼停留某個格仔,要麼沿時段規定的方向移動,問最多能夠移動多少次

\(n,m,k\leq 200\)

題目已經提示了\(o(nmk)\),考慮樸素的搜尋為\(o(n^2mk)\)的,

考慮用單調佇列優化此過程使複雜度降至1s內

#include #include #include #include #define rr register

using namespace std;

const int n=201; struct recques[n];

int n,m,zx,zy,q,q[n],dp[n][n],f[n][n],a[n][n],ans;

inline signed iut()

inline signed max(int a,int b)

bool cmp(rec x,rec y)

while (head<=tail&&i+len=0) q[++tail]=i;

if (head<=tail) dp[i][j]=max(dp[i][j],f[q[head]][j]+q[head]-i);}}

break;

}case 2:

while (head<=tail&&q[head]+len=0) q[++tail]=i;

if (head<=tail) dp[i][j]=max(dp[i][j],f[q[head]][j]+i-q[head]);}}

break;

}case 3:

while (head<=tail&&j+len=0) q[++tail]=j;

if (head<=tail) dp[i][j]=max(dp[i][j],f[i][q[head]]+q[head]-j);}}

break;

}case 4:

while (head<=tail&&q[head]+len=0) q[++tail]=j;

if (head<=tail) dp[i][j]=max(dp[i][j],f[i][q[head]]+j-q[head]); }}

break;

}} }

for (rr int i=1;i<=n;++i)

for (rr int j=1;j<=m;++j)

ans=max(ans,dp[i][j]);

return !printf("%d",ans);

}

Jzoj1771 烽火傳遞 單調佇列優化dp

烽火台又稱烽燧,是重要的軍事防禦設施,一般建在險要或交通要道上。一旦有敵情發生,白天燃燒柴草,定代價。為了使情報準確地傳遞,在連續m個烽火台中至少要有乙個發出訊號。請計算總共最少花費多少代價,才能使敵軍來襲之時,情報能在這兩座城市之間準確傳遞。輸入格式 第一行 兩個整數n,m。其中n表示烽火台的個數...

單調棧,單調佇列

大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...

單調棧 單調佇列

單調棧 單調佇列是在棧和佇列的基礎上加上單調結構的資料結構。如果乙個元素入棧或入隊,他會檢查之前的元素,如果之前的元素不可能是答案的解,那麼就彈出元素,使得當前元素入棧或入隊。leetcode 239 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...