当前位置: 首页 > news >正文

AtCoder AT_abc408_d [ABC408D] Flip to Gather

题目大意

给定一个长度为 N N N 的字符串 S S S,只由 01 组成。现在,反转其中的一些位置,使字符串中要么没有 1,要么所有的 1 都在一个连续的子段内,求最少操作次数。

思路

这是一个决策的问题,我们考虑字符串 10011,有如下几种选择:

  • 把最左侧的一段 1 变成 0
  • 把中间的 0 变成 1
  • 把最右侧的一段 1 变成 0

这是本题动态规划的雏形,我们来仔细考虑一下如何去做。

前置操作:把第 i i i 个连续的 1 的子段的左端点记为 p i p_i pi,将这个子段的长度记为 l i l_i li。把这样的子段个数记为 c n t cnt cnt

状态定义:令 f i f_i fi 表示在完全不改变第 i i i 个子段的情况下,最小答案是多少。

状态转移:显然左右都得考虑。左边: f i = min ⁡ { f i − 1 + p i − ( p i − 1 + l i − 1 − 1 ) − 1 , ∑ j = 1 i − 1 l j } f_i=\min\lbrace f_{i-1}+p_i-(p_{i-1}+l_{i-1}-1)-1,\sum_{j=1}^{i-1}l_j\rbrace fi=min{fi1+pi(pi1+li11)1,j=1i1lj};右边: f i = min ⁡ { f i + 1 + p i + 1 − ( p i + l i − 1 ) − 1 , ∑ j = i + 1 c n t l i } f_i=\min\lbrace f_{i+1}+p_{i+1}-(p_i+l_i-1)-1,\sum_{j=i+1}^{cnt}l_i\rbrace fi=min{fi+1+pi+1(pi+li1)1,j=i+1cntli}。左边与右边之和即为 f i f_i fi 的最终值。

答案:所有 f i f_i fi 的最小值。

代码

AC 记录:Submission #66340268。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;int t, n, cnt;
string s;
int p[200010];
int l[200010];
int f[200010];int main()
{cin >> t;while (t--){cin >> n >> s;s = " " + s + " ";cnt = 0;for (int i = 1; i <= n; i++){if (s[i] == '1' && s[i - 1] != '1'){p[++cnt] = i;l[cnt] = 1;f[cnt] = 1e9;}else if (s[i] == '1')l[cnt]++;}if (cnt == 0 || cnt == 1){cout << "0" << endl;continue;}f[1] = 0;int s = l[1];for (int i = 2; i <= cnt; i++){f[i] = f[i - 1] + p[i] - (p[i - 1] + l[i - 1] - 1) - 1;f[i] = min(f[i], s);s += l[i];}int ans = f[cnt];s = l[cnt];for (int i = cnt - 1; i >= 1; i--){int v = f[i + 1] + p[i + 1] - (p[i] + l[i] - 1) - 1;f[i] += min(v, s);ans = min(ans, f[i]);s += l[i];}cout << ans << endl;}return 0;
}
http://www.xdnf.cn/news/750241.html

相关文章:

  • C++ 变量声明(Declaration)和定义(Definition)的区别
  • 【系统配置与部署类】linux系统下的desktop图标文件配置
  • 如何配置国内docker镜像源?
  • leetcode3128. 直角三角形-medium
  • [VMM]现代 CPU 中用于加速多级页表查找的Page‐Table Entry原理
  • 人工智能在智能健康监测中的创新应用与未来趋势
  • could not select device driver ““ with capabilities: [[gpu]]
  • 红外遥控(外部中断)
  • 关于win10系统中环境变量path变成一行显示的问题
  • Vue ①-实例 || 指令
  • Baklib企业CMS全流程管控与智能协作
  • CppCon 2014 学习:Optimization Tips
  • Fine Pruned Tiled Light Lists(精细删减的分块光照列表)
  • Python60日基础学习打卡Day39
  • 痉挛性斜颈带来的困扰
  • PCIE之Lane Reserval通道out of oder调换顺序
  • 2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版
  • 基于热力学熵增原理的EM-GAM
  • Less基础语法
  • Python打卡训练营学习记录Day41
  • C++:参数传递方法(Parameter Passing Methods)
  • day28 python训练营 类的定义与方法
  • 【Java】ForkJoin 框架
  • linux 1.0.7
  • VC++: identifer “M_PI“ is undefined
  • B3623 枚举排列(递归实现排列型枚举)
  • javaScirpt学习第五章(函数)-第二部分
  • 应用于分子生成的免训练引导多模态流模型 - TFG-Flow 评测
  • 用不太严谨的文字介绍遥测自跟踪天线的基本原理
  • Java中的继承