NOI 2005 瑰麗華爾茲 DP 單調佇列

2021-06-08 16:46:31 字數 2403 閱讀 9778

time limit: 3 sec  

memory limit: 64 mb

submit: 490  

solved: 250 [

submit][

status][

discuss]

你跳過華爾茲嗎?當**響起,當你隨著旋律滑動舞步,是不是有一種漫步仙境的愜意? 眾所周知,跳華爾茲時,最重要的是有好的**。但是很少有幾個人知道,世界上最偉大的鋼琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•t.d.•檸檬•1900,朋友們都叫他1900。 1900在20世紀的第一年出生在往返於歐美的郵輪維吉尼亞號上,很不幸他剛出生就被拋棄了,成了孤兒。1900孤獨的成長在維吉尼亞號上,從未離開過這個搖晃的世界。也許是對他命運的補償,上帝派可愛的小天使艾公尺麗照顧他。 可能是天使的點化,1900擁有不可思議的鋼琴天賦:從未有人教,從沒看過樂譜,但他卻能憑著自己的感覺彈出最沁人心脾的旋律。當1900的**獲得郵輪上所有人的歡迎時,他才8歲,而此時的他已經乘著海輪往返歐美大陸50餘次了。 雖說是鋼琴奇才,但1900還是個孩子,他有著和一般男孩一樣的好奇和調皮,只不過更多一層浪漫的色彩罷了: 這是乙個風雨交加的夜晚,海風捲起層層巨浪拍打著維吉尼亞號,郵輪隨著巨浪劇烈的搖擺。船上的新薩克斯手馬克斯•托尼暈船了,1900招呼托尼和他一起坐上舞廳裡的鋼琴,然後鬆開了固定鋼琴的閘,於是,鋼琴隨著海輪的傾斜滑動起來。準確的說,我們的主角1900、鋼琴、郵輪隨著1900的旋律一起跳起了華爾茲,隨著「嘣嚓嚓」的節奏,托尼的暈船症也奇蹟般的消失了。後來托尼在回憶錄上寫道: 大海搖晃著我們 使我們轉來轉去 快速的掠過燈和家具 我意識到我們正在和大海一起跳舞 真是完美而瘋狂的舞者 晚上在金色的地板上快樂的跳著華爾茲是不是很愜意呢?也許,我們忘記了乙個人,那就是艾公尺麗,她可沒閒著:她必須在適當的時候施展魔法幫助1900,不讓鋼琴碰上舞廳裡的家具。 不妨認為舞廳是乙個n行m列的矩陣,矩陣中的某些方格上堆放了一些家具,其他的則是空地。鋼琴可以在空地上滑動,但不能撞上家具或滑出舞廳,否則會損壞鋼琴和家具,引來難纏的船長。 每個時刻,鋼琴都會隨著船體傾斜的方向向相鄰的方格滑動一格,相鄰的方格可以是向東、向西、向南或向北的。而艾公尺麗可以選擇施魔法或不施魔法:如果不施魔法,則鋼琴會滑動;如果施魔法,則鋼琴會原地不動。 艾公尺麗是個天使,她知道每段時間的船體的傾斜情況。她想使鋼琴在舞廳裡滑行路程盡量長,這樣1900會非常高興,同時也有利於**托尼的暈船。但艾公尺麗還太小,不會算,所以希望你能幫助她。

輸入檔案的第一行包含5個數n, m, x, y和k。n和m描述舞廳的大小,x和y為鋼琴的初始位置(x行y列);我們對船體傾斜情況是按時間的區間來描述的,且從1開始計量時間,比如「在[1, 3]時間裡向東傾斜,[4, 5]時間裡向北傾斜」,因此這裡的k表示區間的數目。 以下n行,每行m個字元,描述舞廳裡的家具。第i行第j列的字元若為『 . 』,則表示該位置是空地;若為『 x 』,則表示有家具。 以下k行,順序描述k個時間區間,格式為:si ti di。表示在時間區間[si, ti]內,船體都是向di方向傾斜的。di為1, 2, 3, 4中的乙個,依次表示北、南、西、東(分別對應矩陣中的上、下、左、右)。輸入保證區間是連續的,即 s1 = 1 si = ti-1 + 1 (1 < i ≤ k) tk = t

輸出檔案僅有1行,包含乙個整數,表示鋼琴滑行的最長距離(即格仔數)。

4 5 4 1 3

..xx.

.....

...x.

.....

1 3 4

4 5 1

6 7 36

題目:題意:主角在矩陣中上下左右移動,使得移動距離最長,給出每次移動方向的最大距離,求最長移動距離

分析:這題可以很輕鬆的想到對於每個方向,只要按照那個方向來做dp就行,但是這樣的dp會很慢,時間複雜度為o(k*n*m*(m或n))這裡具體看資料,一定會超時的,但是每次的答案之和它的前面的格仔有關,我們都是在找其中的最大值,然後再加上與距離有關的值,所以可以用乙個單調佇列來維護

ps:這題比較有意思,而且我華麗的1y了,哈哈

**:

#include#includeusing namespace std;

const int mm=222;

int dx[4]=;

int dy[4]=;

int f[2][mm][mm],q[mm],v[mm];

char map[mm][mm];

int g1,g2;

void solve(int x,int y,int w,int l,int c)

else l=r+1,f[g2][x][y]=-2e9;

x=x+dx[c];

y=y+dy[c];

}}int main()

ans=0;

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

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

ans=max(ans,f[g2][i][j]);

printf("%d\n",ans);

}return 0;

}

NOI2005 瑰麗華爾茲

嘟嘟嘟 這題大家應該都做過,就是暴力dp 單調佇列優化。dp方程其實很好想,最初是這樣的 dp t i j 表示時刻 t 後,走到 i,j 格仔的最遠路程,於是就有 dp t i j max 1 但這是 o tn 2 的,不僅會tle,還能mle。接著看題,發現給得 k 沒用上。想一下發現 k 的特...

2412 NOI2005 瑰麗華爾茲

你跳過華爾茲嗎?當 響起,當你隨著旋律滑動舞步,是不是有一種漫步仙境的愜意?眾所周知,跳華爾茲時,最重要的是有好的 但是很少有幾個人知道,世界上最偉大的鋼琴家一生都漂泊在大海上,他的名字叫丹尼 布德曼 t.d.檸檬 1900,朋友們都叫他1900。1900出生於20世紀的第一年出生在往返於歐美的郵輪...

P2254 NOI2005 瑰麗華爾茲

單調佇列優化線性dp 單調佇列中只需儲存下標 只能優化最內層迴圈 dp c 1 x y dp c 1 x que tl dis x,y,x,que tl 時才將隊尾元素出隊 而不僅僅是dp c 1 x y dp c 1 x que tl 即 用隊中所存下標對應狀態對當前狀態的貢獻為依據選擇是否留在隊...