poj 1821 Fence (dp+单调队列优化) 给n个篱笆,k个工人 接着给k行,分别描述工人的 负责区域大小 涂一个篱笆的收益 他所站的位置 解释一下,一个工人如果涂篱笆了,一定是从他所站的位置出发的,即他负责的区域必须包括自己当前位置 求最大的总收益 dp[i][j] : 前i个工人 负责前j个篱笆的的最大收益 dp[i][j]=max(dp[i][j
最后还有,每块木板只能被涂一次。 解题思路:这是一道单调队列优化dp的问题,首先状态dp[i][j]表示第i个工人刷的最后一块木板为j,注意:木板可刷可不刷,工人也可以不刷任何墙。之前我忘记了,所以状态方程只写对了一半:dp[i][j] = max(dp[i][j],dp[i-1][k] + (j-k)*p[i]),这里还有,dp[i][j]...
这个dp显然可以优化,但是这个不好优化,因为我的方程是dp[i][r]=...,然而i在第一层循环,而r在第三层循环,中间加了一个l。但是我们只要将二三两层循环调换位置就可以了。 又比如 for(inti=1;i<=m;i++){for(intj=0;j<=n;j++){ dp[i][j]=dp[i-1][j]; }for(intlen=1;len<=l[i];len++...
此时要求Si必须在[k+1,j]内部,则对k加以限定:k+1≤Si≤jk+1≤Si≤j 连续长度的表示:j−k≤Lij−k≤Li 中间可空出部分的表示f[i][j]=f[i][j−1]f[i][j]=f[i][j−1] 由此可总结转移方程的三部分 前两部分为f[i][j]=max(f[i−1][j],f[i][j−1])f[i][j]=max(f[...
poj 1821 Fence(dp+单调队列优化) Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5830 Accepted: 1857 Description A team of k (1 <= K <= 100) workers should paint a fence which ...[poj1821] Fence DP单调队列优化 Fence Description A team of k (1 <= K <= 100)...
POJ1821 Fence(单调队列) /*设计状态f[i][j]表示前i人涂前j个,然后进行转移 发现其中一部分可以通过单调队列维护降低复杂度*/#include<iostream>#include<queue>#include#include<vector>#include<cstdio>#include<algorithm>#include<stack>#include<cstring>usingnamespacestd; typedef...
poj 1821 Fence (dp+单调队列优化) 给n个篱笆,k个工人 接着给k行,分别描述工人的 负责区域大小 涂一个篱笆的收益 他所站的位置 解释一下,一个工人如果涂篱笆了,一定是从他所站的位置出发的,即他负责的区域必须包括自己当前位置 求最大的总收益 dp[i][j] : 前i个工人 负责前j个篱笆的的最大收益 ...
poj 1821 动态规划 思路:每次枚举每个工人的右边界j,维护最优的左边界k。那么dp[j]=max(dp[j],dp[k]+(j-k)*w[i].p); 对于每个工人的初值k=w[i].s-1; 令x=j-w[i].l,如果(k-x)*w[i].p>dp[k]-dp[x],则k=x。 #include<set>#include#include<cmath>#include<queue>#include<cstdio...
【POJ 1821】Fence 【原题题面】传送门 【题解大意】 当两个决策k1<k2且 f[i-1,k1] - p*k1 <= f[i-1,k2]-p*k2,那么此时k1就是无用决策。 可以用单调队列优化。 需要支持的操作: 1.当j变大时,b把小于j-L的决策出队; 2.有新的决策入队时,在队尾检查f[i-1,k]的单调性,把无用决策从队...
POJ 1821 Fence ★(单调队列优化DP) 题目大意:有一道线性篱笆由N个连续的木板组成。有K个工人,你要叫他们给木板涂色。每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到的钱。要注意的是,工人i可以选择不涂任何木板,否则,他的涂色区域...