Description
设有一长度为n的初始每个位置均为0的序列A。再给定一个长度为n的01序列B。
有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变。
现在你需要最小化A,B的海明距离。即最小化对应数值不同的位置数目。
Analysis
ans=∑i[a0b1]+[a1b0]
(用
axby
表示
a[i]=x且b[i]=y
)
=∑i[a0b1]+b0−(∑i[a0b0])
设
f[i]=min(∑1<=i∑i[a0b1]−[a0b0])
,答案即为f[n]+sum{b0}
考虑到a1已经没有用了,所以区间覆盖相当于整段跳过
我们只能按左端点排序,区间左端点往右端点转移,这样才能保证转移到的后面状态的值,一定是跳过了某段区间而转移过去的
如下
for(int i=1; i<=n; ++i)
{
for(int k=0;k<v[i].size();k++)
{
int j=v[i][k];
int mi = dp[i-1];
for(int o=max(i-1,1);o<=j;++o)
mi=min(mi,dp[o]);
//mi = min(mi, query(max(i-1,1), j, 1, n, 1));
if(mi < dp[j])
{
dp[j] = mi;
//update(j, mi, 1, n, 1);
}
}
dp[i] = min(dp[i], dp[i-1]+cost[i]);
}