题意: 给定一个数组,要求通过这样一个操作使得a数组全部置0,选定一个区域,异或一个x值,贡献值为区间长度/2向上取整,要求最小置0总贡献值
思路:由于长度/2向上取整,所以所有的操作区间长度都可以由1,2长度的子操作构成,因此,我们只考虑长度为1,2的贡献值
构建一个dp数组dpi,j: 前i-1个元素置0,同时第i个为j的最小贡献值
状态转移为
if (j != a[i])
dp[i][j] = min(dp[i][j], min(dp[i - 1][a[i] ^ j], dp[i - 1][0]) + 1);
else dp[i][j] = dp[i - 1][0];
code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string>
#include<bitset>
#include<cmath>
#include<array>
#include<atomic>
#include<sstream>