CodeForces

Description

你要烤一块牛排,每面需要恰好 (n(nle 10^5)) 秒才能烤好。你可以在 (k(kle100)) 个时间区间翻动牛排。问最终烤好最少需要多少次翻动。

Solution

首先状态定义就比较神... (f[i][j]) 表示前 (i) 秒,当前不在烤的面烤了 (j) 秒的最小次数。

那么显然有 (f[i][j] = f[i-1][j])(f[i][j]=f[i-1][i-j]+1)

注意到第二个转移只有在那些区间内才会发生。

所以考虑 (f[i][j]) 表示前 (r_i) 秒,当前不在烤的面烤了 (j) 秒的最小次数。

同时一个显然的结论是一个区间内至多翻动 (2) 次。

所以转移 (f[i][j]=min{f[i-1][j-t]}+2)(f[i][j]=min{f[i-1][r_i-j-k]}+1) ,其中 (tin [0,r_i-l_i])

这玩意儿可以单调队列搞。

原文地址:https://www.cnblogs.com/aziint/p/9193992.html