2412 NOI2005 瑰麗華爾茲

2021-08-09 15:29:43 字數 3259 閱讀 8077

你跳過華爾茲嗎?當**響起,當你隨著旋律滑動舞步,是不是有一種漫步仙境的愜意?

眾所周知,跳華爾茲時,最重要的是有好的**。但是很少有幾個人知道,世界上最偉大的鋼琴家一生都漂泊在大海上,他的名字叫丹尼·布德曼·t.d.·檸檬·1900,朋友們都叫他1900。

1900出生於20世紀的第一年出生在往返於歐美的郵輪維吉尼亞號上,然後就被拋棄了。1900剛出生就成了孤兒,孤獨的成長在維吉尼亞號上,從未離開過這個搖晃的世界;也許是對他命運的補償,上帝派可愛的小天使艾公尺麗照顧他。

可能是天使的點化,1900擁有不可思議的鋼琴天賦,從未有人教,從沒看過樂譜,但他卻能憑著自己的感覺彈出最沁人心脾的旋律。當1900的**獲得郵輪上所有人的歡迎時,他才8歲,而此時他已經乘著海輪往返歐美50多次了。

雖說是鋼琴奇才,但1900還是個8歲的孩子,他有著和一般男孩一樣的好奇的調皮,不過可能更有一層浪漫的色彩罷了:

這是乙個風雨交加的夜晚,海風捲起層層巨浪拍打著維吉尼亞號,郵輪隨著巨浪劇烈的搖擺。船上的新薩克斯手邁克斯·托尼暈船了,1900將他邀請到舞廳,然後——,然後鬆開了固定鋼琴的閘,於是,鋼琴隨著海輪的傾斜滑動起來。準確的說,我們的主角1900、鋼琴、郵輪隨著1900的旋律一起跳起了華爾茲,所有的事物好像都化為一體,隨著「強弱弱」的節奏,托尼的暈船症也奇蹟般地一點一點恢復。正如托尼在回憶錄上這樣寫道:

大海搖晃著我們

使我們轉來轉去

快速的掠過燈和家具

我意識到我們正在和大海一起跳舞

真是完美而瘋狂的舞者

晚上在金色的地板上快樂的跳著華爾茲是不是很愜意呢?也許,我們忘記了乙個人,那就是艾公尺麗,她可沒閒著:她必須在適當的時候施魔法幫助1900,不讓鋼琴碰上舞廳裡的家具。而艾公尺麗還小,她無法施展魔法改變鋼琴的運動方向或速度,而只能讓鋼琴停一下。

不妨認為舞廳是乙個n行m列的矩陣,矩陣中的某些方格上堆放了一些家具,其他的則是空地。鋼琴可以在空地上滑動,但不能撞上家具或滑出舞廳,否則會損壞鋼琴和家具,引來難纏的船長。

每個時刻,鋼琴都會隨著船體傾斜的方向向相鄰的方格滑動一格,其中相鄰的方格可以是向東、向西、向南或向北的。而艾公尺麗可以選擇施魔法或不施魔法,如果不施魔法,則鋼琴會滑動,而如果施魔法,則鋼琴會原地不動。

艾公尺麗是個天使,她知道每段時間的船體的傾斜情況。她想使鋼琴盡量長時間在舞廳裡滑行,這樣1900會非常高興,同時也有利於**托尼的暈船。但艾公尺麗還太小,不會算,所以希望你能幫助她。

輸入檔案的第一行包含5個數n, m, x, y和k。n和m描述舞廳的大小,x和y為在第1時刻初鋼琴的位置(x行y列);我們對船體傾斜情況是按時間的區間來描述的,比如「在[1, 3]時間裡向東傾斜,[4, 5]時間裡向北傾斜」,因此這裡的k表示區間的數目。

以下n行,每行m個字元,描述舞廳裡的家具。第i行第j列的字元若為『 . 』,則表示該位置是空地;若為『 x 』,則表示有家具。

以下k行,順序描述k個時間區間,格式為:si ti di(1 ≤ i ≤ k)。表示在時間區間[si, ti]內,船體都是向di方向傾斜的。di為1, 2, 3, 4中的乙個,依次表示北、南、西、東(分別對應矩陣中的上、下、左、右)。輸入保證區間是連續的,即

s1 = 1

ti = si-1 + 1 (1 < i ≤ k)

tk = t

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

50%的資料中,1≤n, m≤200,t≤200;

100%的資料中,1≤n, m≤200,k≤200,t≤40000。

考試的時候做到這題只剩二十分鐘於是愉快地去改昨晚的題目惹

聽zzy口糊一波水解之後恍然大悟。考慮dp,設f[t][x][y]表示第t段時間再x,y位置時滑動多少步,那麼我們再列舉四個方向找乙個可行的步數l去轉移就ok了。這樣做的複雜度在隨機資料下表現優異

#include 

#include

#include

#include

#include

#include

#include

#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)

#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)

#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)

#define fill(x, t) memset(x, t, sizeof(x))

#define max(x, y) ((x)>(y)?(x):(y))

#define min(x, y) ((x)<(y)?(x):(y))

#define ll long long

#define inf 0x3f3f3f3f

#define n 202

#define e 1001

#define l 1001

/*1, 2, 3, 4

u, d, l, r

*/int f[2][n][n], mp[n][n], s[n], t[n], d[n];

char str[n];

inline int read()

int main(void)

}fill(f, -31);

f[0][x][y] = 0;

rep(i, 1, k)

rep(now, 1, k)

if (d[now] == 1)

f[now & 1][i][j] = max(f[(now - 1) & 1][i + l][j] + l, f[now & 1][i][j]);

}} else

if (d[now] == 2)

f[now & 1][i][j] = max(f[(now - 1) & 1][i - l][j] + l, f[now & 1][i][j]);

}} else

if (d[now] == 3)

f[now & 1][i][j] = max(f[(now - 1) & 1][i][j + l] + l, f[now & 1][i][j]);

}} else

if (d[now] == 4)

f[now & 1][i][j] = max(f[(now - 1) & 1][i][j - l] + l, f[now & 1][i][j]);}}

}}

}int ans = 0;

rep(i, 1, n)

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

return

0;}

Luogu 2254 NOI2005 瑰麗華爾茲

簡單dp,設 f 表示第i個時間段,鋼琴處在 j,k 位置移動距離的最大值,那麼有轉移 f max f f max f 其中 j dx len leq a leq j 1 k dy len leq b leq k 1 len ed st 1 其實就是乙個滑動視窗,考慮到轉移順序,就是寫四遍單調佇列 ...

luoguP2254 NOI2005 瑰麗華爾茲

題目比較好,人比較菜。include define maxn 205 using namespace std int n,m,x,y,k,f maxn maxn maxn l,r,d,dx 7 dy 7 l,r,q maxn ans 0 char tu maxn maxn int main mems...

NOI2005 瑰麗華爾茲

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