據說在紅霧異變時,博麗靈夢單身前往紅魔館,用十分強硬的手段將事件解決了。
然而當時靈夢在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 11 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;
}
**二
#includeusingnamespace
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 ...