传送门:点击打开链接
题意:有K个工人,和长为N的篱笆,现在要给篱笆上色。每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱
问如何分配,使得K个工人的总利润最大
思路:先设出方程,设
dp[i][j]表示前i个工人,前j个篱笆的最大获利
那么就有
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
dp[i][j]=max(dp[i][j],dp[i-1][k]+(j-k)*P[i]); j>=S[i],k<S[i]且k+L[i]>=j
那么我们就能想到用单调队列来优化了
这里主要要想清楚k的范围,那么就好做了
#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define fuck(x) cout<<"[&