题目大意
给定长度为n的数组中不能出现a=2ba=2ba=2b
问最少删除多少个元素
题解
从111到10610^6106排列开,其中a=2ba=2ba=2b
dp[i][0]dp[i][0]dp[i][0] 奇数
dp[i][1]dp[i][1]dp[i][1] 偶数
当 iii 为奇数时, 直接记录。为偶数时, 判断一下前面的数是否扣掉再加
代码
#include <iostream>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define fep(i,a,b) for(int i=a;i>=b;--i)
const int N = 1e6;
int arr[N+10], dp[N+10][2];
void solve()
{
int n,m;
cin >> n;
rep(i,1,n) {
cin >> m;
arr[m]++;
}
rep(i,1,N) {
if(i%2==1)
{
dp[i][0] = arr[i];
dp[i][1] = 0;
}
else
{
dp[i][0] = min(dp[i/2][0], dp[i/2][1])+arr[i];
dp[i][1] = dp[i/2][0];
}
}
int ans = 0;
for(int i=N;2*i>N;--i) ans += min(dp[i][0], dp[i][1]);
//fep(i,N,N/2)
cout << ans;
}
int main() {
solve();
return 0;
}

该博客介绍了如何使用动态规划解决一个算法问题:在给定长度为n的数组中,目标是避免出现'a=2b'的模式,求最少删除多少个元素。博主给出了详细的题解思路,包括状态转移方程的设定,并提供了C++实现的代码片段。通过遍历从1到10^6的所有数字,分别计算奇数和偶数位置上的最优解,最终得出答案。

1162

被折叠的 条评论
为什么被折叠?



