胖子很有錢。他購買了乙個先進的跑步機(真的不一樣哦~~~~)。
這個跑步機是這樣的:
可以把它看成乙個n*m的矩陣。有的格仔是障礙不能經過(用x表示),有的格仔是空地可以經過(用.表示)。
對於每乙個時段,跑步機有不同的傾斜方向。由於胖子太胖了,所以他這個時候只有2種選擇:要麼沿這個方向移動(每秒移動1個格仔),或者艱難的保持在原來的位置不動。
現在胖子已經設定好了跑步機在不同時段中的傾斜方向。眾所周知,保持在原地不動是不會做功的。胖子要**就要做功。所以他想知道他最多能夠跑多長的路程。
設 \(f[k][i][j]\) 表示第 \(k\) 個時段後在 \((i,j)\) 的最大路程。
假設第 \(k\) 個時刻是向上的,那麼 \(f[k][i][j]\) 可能由 \(f[k-1][i\sim n][j]\) 轉移而來。注意要判斷不能走的格仔和這個時刻的時間大小。
暴力搞是 \(o(kn^3)\) 的,發現乙個點只可以由一段前面固定長度的區間最大值轉移而來,直接上單調佇列優化即可。
時間複雜度 \(o(kn^2)\)。
#include #define clear
using namespace std;
const int n=210,inf=1e9;
int n,m,sx,sy,t,ans,f[n][n][n];
char ch[n][n];
dequeq;
struct node
a[n];
bool cmp(node x,node y)
}} if (a[k].p==2)
}} if (a[k].p==3)
}} if (a[k].p==4)
}} }
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
ans=max(ans,f[t][i][j]);
printf("%d",ans);
return 0;
}
單調佇列 JZOJ 1753 鍛鍊身體
乙個 n m 的矩陣,有些格仔不能經過,有 k 個時段,要麼停留某個格仔,要麼沿時段規定的方向移動,問最多能夠移動多少次 n,m,k leq 200 題目已經提示了 o nmk 考慮樸素的搜尋為 o n 2mk 的,考慮用單調佇列優化此過程使複雜度降至1s內 include include incl...
塑身 鍛鍊身體不能由性而為
人們都知道體育鍛煉對健康的重要性,一方面,適度的運動可以促進血液迴圈和新陳代謝,調節和興奮大腦神經中樞,增強和提高免疫力 另一方面,運動還可以增加飲食,提高睡眠質量。但在鍛鍊身體的時候,要把握好鍛鍊前 鍛鍊中和鍛鍊後這三個環節,這樣才能達到鍛鍊的最佳效果。鍛鍊前的準備工作要做好 人們鍛鍊應該選擇適宜...
C語言入門程式設計題 鍛鍊身體吧
題目內容 沫沫,灰灰和渣渣去鍛鍊身體,如果對他們跑步的距離分別只計整數 a b c,由於他們身高的差距,造成了 a b c,並且渣渣跑了n公尺之後就再也跑不動了。但是,按照他們事先的約定 只有當 cc aa b b 時,他們的鍛鍊才有效果。現在他們三個人想知道,如果渣渣的極限n已知,那麼有多少種有鍛...