洛谷 P3800 Power收集

2022-06-02 00:42:13 字數 2450 閱讀 9624

據說在紅霧異變時,博麗靈夢單身前往紅魔館,用十分強硬的手段將事件解決了。

然而當時靈夢在power達到max之前,不具有「上線收點」的能力,所以她想要知道她能收集多少p點,然而這個問題她答不上來,於是她找到了學oi的你。

可以把遊戲介面理解成乙個n行m列的棋盤,有k個格仔上有p點,其價值為val(i,j)

初始靈夢可以選擇在第一行的任意乙個格仔出發,每秒她必須下移一格。

靈夢具有乙個左右移動的速度t,可以使她每秒向左或右移動至多t格,也可以不移動,並且不能折返。移動可視為瞬間完成,不經過路途上的點,只能獲得目標格仔的p點。

求最終她能獲得的power值最大是多少?

輸入格式:

第一行四個數字,n,m,k,t

接下來k行每行3個數字x,y,v,代表第x行第y列有乙個val為v的p點,資料保證乙個格仔上最多只有1個p點。

輸出格式:

乙個數字

輸入樣例#1:

3 3 4 1

1 1 3

1 2 1

2 2 3

3 3 3

輸出樣例#1:

9

對於40%的測試點,1<=n,m,t,k<=200

對於100%的測試點,1<=n,m,t,k<=4000

v<=100,n,m,k,t均為整數

by-szc

dp,我想到的有以下兩種思路

1、類似於這道題,可以從下到上一行行地填 f 陣列,對於一行中的每乙個,容易想到暴力搜尋下一行從**轉移過來,複雜度$o(nmt)$,然後就爆了。於是咋辦呢?發現我們填$f[i][j]$時,搜了一遍$f[i+1][j-t]$到$f[i+1][j+t]$(不要在意邊界溢位,特判一下就是了),然後填$f[i][j+1]$時,除了搜$f[i+1][j+t+1]$之外,又搜了一遍$f[i+1][j-t+1]$到$f[i+1][j+t]$,重複好多啊,於是怎麼辦呢?就想到了這題(給乙個序列,求所有一定長度的區間中的最值,嗯,rmq,可以用st表,也可以用單調佇列,這裡套在每一行上,總複雜度就分別是$o(nmlog_2m)$(套st表)$o(nm)$(套單調佇列),於是,st表有點虛啊,常數很大的同學可能就卡不過去了,而且st表空間$o(mlog_m)$,單調佇列空間$o(t)$,還有……單調佇列比st表好寫太多了,果斷單調佇列,見下面第乙個**,最慢乙個點862ms,怪不得出題人把時限開到2s,放了這個大眾的思路

2、和打鼴鼠這題很像,可以看看我這篇博文。存下所有power的資訊,然後按照行號、列號排個序,然後就類似最長不下降序列的dp做法了,每拓展乙個位置,就向前掃瞄已經拓展的所有的位置,看看能從**來到這裡,如果速度、時間都滿足,就重新整理最大值吧。見以下**二。這個的時間複雜度$o(k^2)$,和上面那個單調佇列是同階的,但是這個思路實際用時是上面的二分之一,占用空間是上面的快十分之一,**量是上面的二分之一,果然$\mbox$啊。

2023年8月9日09:20:05更新:這就是傳說中的單調佇列優化dp麼……上面鏈結掛了不少……第乙個鏈結咋是回文平方數啊,我原本想掛那個題啊,是這個嗎洛谷這樣子把題庫改來改去不太好……以後掛鏈結還是掛我自己部落格的吧

**一(單調佇列)

#include#include

#include

using

namespace

std;

intn,m,k,t;

int a[4002][4002]=,f[4002][4002]=,q[4002]=;

void work(int

i) l=0,r=0

;

//memset(q,0,sizeof(q));

for(int j=m;j>=1;j--)

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

f[i][j]+=a[i][j];

}int

main()

for(int i=1;i<=m;i++) f[n][i]=a[n][i];

for(int i=n-1;i>0;i--)

work(i);

int ans=-1

;

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

ans=max(ans,f[1

][j]);

printf("%d

",ans);

return0;

}

**二

#includeusing

namespace

std;

intn,m,k,t;

struct

edgea[

4005

];int

cmp(edge x,edge y)

int f[4005]=;

intmain()

printf("%d

",ans);

return0;

}

哇,簡直就是打鼴鼠的**複製過來啊,那題不排序但這題排序是因為那題輸入按時間順序,這個沒說按順序

洛谷p3800power收集

原題 一道很不錯的優先佇列題 f i j 的最大值由上一行的狀態有關,轉移方程f i j max f i 1 z a i j z j k,j k 每個轉移會超時,所以我們對上一行建立單調佇列,由1推到m,提前入隊,超出範圍出隊。include include include include incl...

洛谷P3800 Power收集

顯然這是一道dp題,樸素演算法很容易想 dp i j v i j max dp i 1 k j t leq k leq j t 然而這樣的轉移是 o nm 2 的,不合要求,還要繼續優化。注意到 k leq 4000 棋盤的資料是相當稀疏的,那麼我們考慮將有p點的格仔當成乙個結點,建圖。根據題意 必...

洛谷 P3800 Power收集 題解

題目 p3800 power收集 單調佇列 dp 考慮 f i j f i j f i j 表示走到位置 i,j i,j i,j 時可以獲得的最大權值 我們發現 f i j f i j f i j 是由 f i j k f i j k f i j k sim f i j k f i j k f i ...