題意:給長度為n的木板,k個工人,每個工人要麼不粉刷,或者選擇乙個包含木板si,長度不超過li的連續的一段木板粉刷,每粉刷一塊得到pi的報酬,問如何安排工人使得總報酬最大?
思路:可以按si給工人排序,這樣我們就可以按照順序依次安排工人。設f[i][j]表示到第i個工人,刷到前j塊木板的最大報酬,
三種情況
工人不刷:f[i][j]=f[i-1][j]
木板空著:f[i][j]=f[i][j-1]
第i個工人刷k+1到j的木板,其中k,j滿足k+1<=si<=j,報酬就是f[i][j]=f[i-1][k]+pi*(j-k),拆開得pi*j+(-pi*k+f[i-1][k])。可以發現對於每個j來說,要找到它對應的最大報酬,需要嘗試範圍內的所有k值,而實際上我們可以發現隨著列舉j,j的增大,所對應的k的區間範圍的上下界也是遞增的,這樣的話,我們就可以考慮使用單調佇列來優化列舉k的過程,又因為要使報酬最大,所以我們需要維護乙個單調遞減的序列來維護-pi*k+f[i-1][k]這個只與k相關的最大值。
#include#includeusing
namespace
std;
const
int maxn=16005
;struct
note
a[maxn];
intq[maxn];
bool
operator
<(note a,note b)
int f[105
][maxn];
int calc(int i,int
k)int
main()
for(int j=1; j<=n; j++)}}
printf(
"%d\n
",f[k][n]);
}
單調佇列1006 POJ 1821 Fence
題意 有乙個長度為n的牆壁,有k個粉刷匠來刷牆 每個粉刷匠都有三種屬性 1.最大刷牆的距離 必須是連續的區間 2.刷每塊牆的 3.初始位置 刷牆的區間必須包含初始位置 求這幾個粉刷匠刷長度為n的牆最多賺多少錢 思路 我們考慮 dp i j 為前i個粉刷匠刷前j面牆最多的賺的錢 我們考慮對於每個粉刷匠...
POJ 1821 單調佇列優化DP
題意 有一道線性籬笆由n個連續的木板組成。有k個工人,你要叫他們給木板塗色。每個工人有3個引數 l 表示 這個工人可以塗的最大木板數目,s表示這個工人站在哪一塊木板,p表示這個工人每塗乙個木板可以得到的錢。要注意的是,工人i可以選擇不塗任何木板,否則,他的塗色區域必須是連續的一段,並且s i 必須包...
D 訓練技巧(dp,單調佇列優化)
有n天,每天訓練收益為ei,如果連續訓練了k天,則必須休息一天,問訓練的最大收益,1 n,k 1e5 dp i 表示第i天不訓練,前i天的最小損失,dp i min dp i dp j a i j i 1 i 2 i k 1 答案就是第n 1天不訓練,sum 前n天的最小損失嘍 這樣還是會超時,需要...