乙個\(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 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...