题解:CF360B Levko and Array
Pro
求在至多修改
Sol
1. 二分答案
这题的二分挺明显的:因为如果能使
2. 怎么 check
考虑外面套一个二分答案,考虑中间怎么 check。
check 的问题是:修改至多
3. DP 状态
1.0: 定义
但是这么写会很难受,因为我们没有一个定值,这个值不动,不方便我们 DP。
2.0: 定义
这样子我们可以通过
4. DP 方程
考虑
先考虑
这是一个植树问题。
然而就这么简单一个四年级小盆友都会的植树问题,很多题解都没有写为什么,甚至还有写什么感性证明的。
方程:显然把
有人说:这肯定不是最优的啊。比如这个 hack:
1 2 3 4 4 4 4 4
j i
中间的三个
但是这只是在这个
5. DP 初值
把所有数都改成
6. 如何判断
显然,
所以
7. 核心代码
memset(dp,127,sizeof(dp)); // 不对啊你是来干什么的
for(int i=1;i<=n;i++) dp[i]=i-1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
{
int len=i-j+1; // 小学植树问题
if(abs(a[i]-a[j])<=(len-1)*ans)
dp[i]=min(dp[i],dp[j]+len-2);
}
for(int i=1;i<=n;i++)
if(n-i+dp[i]<=k) return 1;
return 0;
8. 时空复杂度分析
空间复杂度:
时间复杂度:里面一个