題解 Fence 單調佇列

2022-02-23 21:03:32 字數 865 閱讀 3139

poj - 1821

有\(k\)個粉刷匠,每個粉刷匠一定要粉刷某個位置\(s_i\),乙個粉刷匠可以粉刷至多\(l_i\)個位置(必須連續\(l_i\)互不相同),乙個粉刷匠粉刷乙個位置要收\(p_i\)元,問怎麼安排可以使得粉刷匠賺的錢最大。

\(dp(i,j)\)考慮了前\(i\)個人,考慮了前\(j\)個位置的最大值,轉移是這樣的:

\[dp(i,j)=\max\,dp(i-1,j),dp(i,j-1)\},k\in[j-l_i,s_i)

\]按照討論把第二個\(\max\)變一下

\[max\=\max\+jp_i

\]現在問題就變成如何維護\(\max\\)

單調佇列就好了。注意一些細節:

目標:\(dp(k,n)\)。

//@winlere

#include#include#include#include#includeusing namespace std; typedef long long ll;

inline int qr()

const int maxn=1.6e4+5;

struct node

inline void scan()

inline bool operator <(const node&a)const

for(register int i=data[t].s;i<=min(n,data[t].s+data[t].l-1);++i)

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

dp[t][i]=max(dp[t][i],max(dp[t-1][i],dp[t][i-1]));

}cout

}

單調佇列1006 POJ 1821 Fence

題意 有乙個長度為n的牆壁,有k個粉刷匠來刷牆 每個粉刷匠都有三種屬性 1.最大刷牆的距離 必須是連續的區間 2.刷每塊牆的 3.初始位置 刷牆的區間必須包含初始位置 求這幾個粉刷匠刷長度為n的牆最多賺多少錢 思路 我們考慮 dp i j 為前i個粉刷匠刷前j面牆最多的賺的錢 我們考慮對於每個粉刷匠...

POJ1821 Fence 單調佇列優化DP

題意 給長度為n的木板,k個工人,每個工人要麼不粉刷,或者選擇乙個包含木板si,長度不超過li的連續的一段木板粉刷,每粉刷一塊得到pi的報酬,問如何安排工人使得總報酬最大?思路 可以按si給工人排序,這樣我們就可以按照順序依次安排工人。設f i j 表示到第i個工人,刷到前j塊木板的最大報酬,三種情...

C 單調佇列與單調棧 滑動視窗題解

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.第1行 2個整數n,k k n 1000000 第2行 n個整數,表示陣...