題目描述見鏈結 .
連續的工作的牛不超過 k
k 個 →
→ 第 i
i 頭牛若工作, 則左邊與其 相距最近的不工作的牛 座標範圍為 [i−
k,i]
[i−k
,i] .
所以可以想到 dpd
p, 設 f[i
,1/0
]f[i
,1/0
] 表示前 i
i 頭牛, 第 i
i 頭牛 工作/不工作 所能得到的最大價值,狀態
轉移狀態
轉移:f
[i,0
]=max(f
[i−1
,0],
f[i−
1,1]
)f[i
,1]=
max(f
[j,0
]+su
m[i]
−sum
[j])
=max(
f[j,
0]−s
um[j
])+s
um[i
](j∈
[i−k
,i])
f[i,
0]=max(f
[i−1
,0],
f[i−
1,1]
)f[i
,1]=
max(f[
j,0]
+sum
[i]−
sum[
j])=
max(f[
j,0]
−sum
[j])
+sum
[i](
j∈[i
−k,i
])其中 f[i
,0]−
sum[
j]f[
i,0]
−sum
[j] 可以使用單調佇列優化 .
#include
#define reg register
typedef
long
long ll;
const
int maxn =
1e5+5;
int n;
int k;
int a[maxn]
;ll sum[maxn]
;ll f[maxn][2
];intmain()
printf
("%lld\n"
, std::
max(f[n][0
], f[n][1
]));
return0;
}
P2627 修剪草坪
在一年前贏得了小鎮的最佳草坪比賽後,farm john變得很懶,再也沒有修剪過草坪。現在,新一輪的最佳草坪比賽又開始了,farm john希望能夠再次奪冠。然而,farm john的草坪非常髒亂,因此,farm john只能夠讓他的奶牛來完成這項工作。farm john有n 1 n 100,000 ...
修剪草坪 單調佇列
這道題我們可以換乙個角度思考,把題意看成 我們找到哪些奶牛不選,且滿足每兩個相鄰的不選的奶牛之間不能間隔超過k,當這些不選的奶牛的貢獻總和最低時,我們選的奶牛貢獻就最高了!這個過程用單調佇列優化一下即可,然而博主太弱了,就用了個優先佇列 include include include include...
DP 單調佇列優化 修剪草坪
題目描述 在一年前贏得了小鎮的最佳草坪比賽後,約翰變得懶惰了,再也沒有修剪過草坪。現在,新一輪的比賽又開始了,約翰希望能夠再次奪冠。然而,約翰家的草坪非常髒亂,因此,約翰需要讓他的奶牛來完成這項工作。約翰家有n頭奶牛,排成一直線,編號為1到n。每只奶牛的能力是不同的,第i頭奶牛的能力為ei。靠在一起...