poj 1821 Fence(单调队列)】的更多相关文章

/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 110 #define maxm 16010 using namespace std; int n,m,f[maxn][maxm],ans; struct node{ int l,s,p; bool operator < (const…
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂完前j个位置的最大收益. 然后转移考虑 第i个人可以不刷.dp[i][j]=dp[i-1][j]; 第j个木板可以不刷dp[i][j]=dp[i][j-1]; 然后当c[i].s<=j<=s[i]+l[i]-1时 dp[i][j]=p[i]*j+max(dp[i-1][k]-p[i]*k)其中j-…
poj 1821 Fence \(solution:\) 这道题因为每一个粉刷的人都有一块"必刷的木板",所以可以预见我们的最终方案里的粉刷匠一定是按其必刷的木板的顺序排列的.这就提示了我们可以用线性 $ DP $,只需要将粉刷匠按必刷的木板排序即可. 设 $F[ $ i $ ][j]$ 表示前 $ i $ 个粉刷匠刷了前 $ j $ 快木板的最大收益(可以有木板不刷!).我们可以根据题意列出转移方程: 首先这个粉刷匠一块木板也不刷 这块木板不刷 这个粉刷匠从第k块木板刷到第 $ j…
[题解]Fence(单调队列) POJ - 1821 题目大意 有\(k\)个粉刷匠,每个粉刷匠一定要粉刷某个位置\(S_i\),一个粉刷匠可以粉刷至多\(l_i\)个位置(必须连续\(l_i\)互不相同),一个粉刷匠粉刷一个位置要收\(p_i\)元,问怎么安排可以使得粉刷匠赚的钱最大. \(dp(i,j)\)考虑了前\(i\)个人,考虑了前\(j\)个位置的最大值,转移是这样的: \[ dp(i,j)=\max\{\max\{dp(i-1,k)+(j-k)\times p_i\},dp(i-1…
Fence Time Limit: 1000ms Memory Limit: 30000KB This problem will be judged on PKU. Original ID: 182164-bit integer IO format: %lld      Java class name: Main   A team of k (1 <= K <= 100) workers should paint a fence which contains N (1 <= N <…
题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移比较显然,dp[i] = min{dp[j] + max(a[j + 1] , a[j + 2] ... + a[i])}, 其中a[j + 1] + a[j + 2] +... + a[i] <= m;这个dp转移是O(n^2)的,我们需要用单调队列优化.单调队列维护的是a值单调递减的序列(要保证…
Poj   Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到Pi的报酬.求如何安排能使工匠们获得的总报酬最多. 1<=N<=16000,1<=M<=100 Sol 先把所有工匠按照Si从小到大排序,使我们能够按顺序进行线性Dp. 设$F[i][j]$表示前i个工匠粉刷前j块木板的最大报酬(包含空着不刷的木板).转移分为三种情况: 1.第i个工匠啥…
题意: 给出序列,找出每个连续长度为k的子序列的最大值和最小值. 思路: 裸单调队列... 单调队列这东西用的真的非常局限,大概只能用到这种情景中== 简单说一下维护: 添加元素,为了保持单调性,排除队尾所有比要添加的元素大或者小的元素. 出队,出队之前要保证要出队的元素在当前范围内,如果不在先把不在的都出队. 这题可以只记录索引号,所以内存还是可以优化的,懒得写了. 坑: 复制自己的两段代码忘记改其中一个大于号.WA了一上午.不要不要的. #include<stdio.h> #include…
id=1742" target="_blank">题目链接~~> 做题感悟:第一次做的时候用的二进制优化.可是没注意到是险过.so也没去看单调队列的解法. 解题思路: 假设你做过单调队列的题,或者看过相关的博客就好理解这题了.博客. 再加上这题体积与价值相等那么就更好做了.仅仅有 j %v[ i ] 余数同样的才干够同一时候处理(j 指的是某个体积的值),在计算某个数的时候,仅仅要计算前面的同样的余数中(在个数限制内)是否有 true(有放满的) 就能够了. 代码…
单调队列优化dp 我们把状态定位F[i][j]表示前i个工人涂了前j块木板的最大报酬(中间可以有不涂的木板). 第i个工人不涂的话有两种情况: 那么F[i - 1][j], F[i][j - 1]就成为了转移状态的候选. 那如果第i个工人要涂的话,我们可以假设我们是从k+1涂到j的,根据题意可以求出k的取值范围,然后状态转移的条件限制了j的取值范围. 我们考虑每j从小到大增加的过程,j对应的k的取值是一个上界不变下届变大的区间,是一个滑动窗口,那我们可以用单调队列来维护决策k的最优候选. #in…