上海计算机学会 2023年12月月赛 丙组T5 特定的串(动态规划)

上海市青少年算法月赛丙组—目录汇总 上海市青少年算法月赛—目录汇总 阅读详情

第五题:T5特定的串

标签:动态规划
题意:给定 01 01 01串,可以修改其中任意一个字符,把 0 0 0变成 1 1 1,把 1 1 1变成 0 0 0,不能删除或者增加 01 01 01字符,求最少修改个数,使得给定序列中不含特定子串 110 110 110。
题解:
贪心 90 90 90 分解法:比较容易想到的一个思路是把 11 11 11变成 10 10 10,或者把所有 0 0 0变成 1 1 1。
这个思路有以下几个反例:
101111101 101111101 101111101(这个只需要把后面的那个 0 0 0改成 1 1 1)
1100111101 1100111101 1100111101(这个可以把第 2 2 2个 1 1 1改成 0 0 0,最后那个 0 0 0改成 1 1 1)
像第二个反例,我们需要思考把两种贪心策略进行结合。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, num = 0; // num: 连续1的个数
    // c1: 11110变成10100
    // c2: 11011变成11111
    int c1 = 0, c2 = 0;
    string s;
    cin >> n >> s;
    for (int i = 0; i < n; i++) {
        if (s[i] == '0') {
            c2++;
            c1 += num / 2;
            num = 0;
        } else {
            num++;
        }
    }
    cout << min(c1, c2) << endl;
    return 0;
}
// 9
// 101111101

// 10
// 1100111101

动态规划解法:
d p [ i ] [ 0 / 1 ] [ 0 / 1 ] dp[i][0/1][0/1] dp[i][0/1][0/1]:以第 i i i位为结尾,使得前 i i i个字符中不包含 110 110 110,且第 i i i位是 0 0 0或 1 1 1,第 i − 1 i-1 i−1位是 0 0 0或 1 1 1的最少修改个数。
考虑状态转移:
一、如果 s [ i ] s[i] s[i]修改成 0 0 0

  1. d p [ i ] [ 0 ] [ 0 ] dp[i][0][0] dp[i][0][0]( s [ i ] = 0 , s [ i − 1 ] = 0 s[i]=0,s[i-1]=0 s[i]=0,s[i−1]=0)可以从 s [ i − 2 ] = 0 / 1 s[i-2]=0/1 s[i−2]=0/1转移过来,即 d p [ i ] [ 0 ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] [ 0 ] , d p [ i − 1 ] [ 0 ] [ 1 ] ) dp[i][0][0] = min(dp[i-1][0][0], dp[i-1][0][1]) dp[i][0][0]=min(dp[i−1][0][0],dp[i−1][0][1])
  2. d p [ i ] [ 0 ] [ 1 ] dp[i][0][1] dp[i][0][1]( s [ i ] = 0 , s [ i − 1 ] = 1 s[i]=0,s[i-1]=1 s[i]=0,s[i−1]=1)只能从 s [ i − 2 ] = 0 s[i-2]=0 s[i−2]=0转移过来,即 d p [ i ] [ 0 ] [ 0 ] = d p [ i − 1 ] [ 1 ] [ 0 ] dp[i][0][0] = dp[i-1][1][0] dp[i][0][0]=dp[i−1][1][0]

二、如果 s [ i ] s[i] s[i]修改成 1 1 1
那不管是 001 001 001、 101 101 101、 111 111 111 011 011 011都是可以的。所以
d p [ i ] [ 1 ] [ 0 ] = m i n ( d p [ i − 1 ] [ 0 ] [ 0 ] , d p [ i − 1 ] [ 0 ] [ 1 ] ) dp[i][1][0] = min(dp[i-1][0][0], dp[i-1][0][1]) dp[i][1][0]=min(dp[i−1][0][0],dp[i−1][0][1])
d p [ i ] [ 1 ] [ 1 ] = m i n ( d p [ i − 1 ] [ 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] [ 1 ] ) dp[i][1][1] = min(dp[i-1][1][0], dp[i-1][1][1]) dp[i][1][1]=min(dp[i−1][1][0],dp[i−1][1][1])
然后再上面转移的过程中要考虑 s [ i ] s[i] s[i]是否修改,所以要把这个修改的代价都带上。
最后从 d p [ n − 1 ] dp[n-1] dp[n−1]的四种情况里面取最小值就可以了。
代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 5e5 +10;
char s[N];
int dp[N][2][2];
// 以第i位为结尾,使得前i个字符中不包含110,
// 且第i位是0或1,第i-1位是0或1的最少修改个数

int main() {
    int n;
    cin >> n >> s;
    int s0 = s[0] - '0', s1 = s[1] - '0';
    dp[1][s1][s0] = 0;
    dp[1][s1^1][s0] = dp[1][s1][s0^1] = 1;
    dp[1][s1^1][s0^1] = 2;

    for (int i = 2; i < n; i++) {
        int d = 0;
        // s[i]修改成0
        if (s[i] != '0') d = 1;
        dp[i][0][0] = min(dp[i-1][0][0], dp[i-1][0][1]) + d;
        dp[i][0][1] = dp[i-1][1][0] + d;

        // s[i]修改成1
        d = 0;
        if (s[i] != '1') d = 1;
        dp[i][1][0] = min(dp[i-1][0][0], dp[i-1][0][1]) + d;
        dp[i][1][1] = min(dp[i-1][1][0], dp[i-1][1][1]) + d;
    }
    cout << min(min(dp[n-1][0][0], dp[n-1][0][1]), min(dp[n-1][1][0], dp[n-1][1][1]));
    return 0;
}
上海市青少年算法2024年3月月赛(丙组)试题解析 阅读详情

相关推荐

【ELF2学习板】基于OpenMP与RK3588多核架构优化FFTW的并行计算效率

本文详细介绍了如何在ELF2学习板上利用OpenMP与RK3588多核架构优化FFTW的并行计算效率。通过编译支持OpenMP的FFTW库、合理设置线程绑定与调度策略,以及内存访问优化等技巧,显著提升了FFT计算的性能。实测数据显示,多核并行优化可使4096点FFT计算速度提升一倍以上,特别适合信号处理、图像分析等高性能计算场景。

weixin_30352645的博客 604

上海市计算机学会竞赛平台丙组比赛目录及题解持续更新中

持续更新中。。。

长春高老师编程 1万+

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1096

上海计算机学会12月月赛 丙组题解

上海计算机学会12月月赛 丙组题解

超哥聊信奥 1453

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1528

国产数据库安装部署说明

国产数据库安装部署说明

weixin_38203586的博客 907

上海计算机学会2023年12月月赛C++丙组T5特定的串

请问,最少需要修改多少数字才能让给定的序列中不含有特定的一个子串 110。内存限制: 256 Mb时间限制: 1000 ms。我们可以修改该序列的任意一个数字,可以将。序列 b1​b2​…的意思就是这个数列里只有。,注意不能删除或增加数字。二是把所有11改成10;一是把所有0改成1;

长春高老师编程 1216

手把手教你用AD9834 DDS模块DIY一个可调信号源(附AD原理图/PCB/程序)

本文详细介绍了如何使用AD9834 DDS模块DIY一个高精度可调信号源,涵盖硬件搭建、原理图解读、PCB优化和程序烧录等关键步骤。通过STM32控制实现0-10MHz频率范围输出,特别适合电子设计与射频实验,提供完整的AD原理图、PCB设计和程序代码参考。

weixin_31854867的博客 406

上海市计算机学会竞赛平台乙组比赛目录及题解持续更新中

T2 消除交叉 T3 竞速溜冰 T4 多米诺骨牌。T2 放置拼块 T3 制作哒宝 T4 区间交集。T1 发红包 T2 图的三染色 T3 最大子集。T2 千层背包 T3 随处游荡 T4 打字。T2 赛车 T3 围三角 T4 退课。T3 树的匹配 T4 平分子集(三)T3 炼制合金 T4 数三角形(二)T3 降低均值 T4 加与乘(二)T3 子集和(三) T4 社交软件。T3 树的最长路 T4 最大频率。T3 字符填充 T4 看小说。

长春高老师编程 9677

《QGIS快速入门与应用基础》294:双地图框布局(真彩色+假彩色对比)

摘要 本文详细介绍了在QGIS中创建专业级遥感影像对比地图的完整流程。作者作为时空智能领域专家,重点讲解了双地图框布局的实现方法,通过真彩色与假彩色影像的同步对比,满足学术研究和工程应用需求。文章包含三个核心部分:1) 前期准备工作,包括图层复制、标准化命名和参数校验;2) 布局创建与页面设置,详细说明了A4横向布局的参数配置;3) 双地图框同步技术,提供了复制粘贴法和手动设置两种实现方案。教程特别强调图层锁定、比例尺固定等关键操作,确保对比图的专业性和准确性,适合GIS从业人员和遥感研究者学习参考。

LuckyHanMo的博客 357

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

上海计算机学会2023年12月月赛C++乙组T3递增路径

典型的动态规划问题,先将个点按高度从低到高排序,依次确定以其为结尾递增路径的长度(排序是为了保证比他矮的都已经有了结果)。给定 n×m 个方格组成的方格图,其中第 i 行第 j 列的方格具有高度 hi,j​。方格图的路径定义为方格图中一些方格组成的序列,在序列中相邻的方格应在图中共享同一条边。所谓递增路径,是指从该路径的第一个方格开始,每一个方格的高度都应该严格大于前一个方格。请在该方格图中寻找一条递增路径,并输出输出这条递增路径的最大长度。内存限制: 256 Mb时间限制: 1000 ms。

长春高老师编程 1219

大模型之Spring AI实战系列(二十六):Spring Boot + DeepSeek 实战指南:构建AI聊天应用

在人工智能技术飞速发展的今天,大型语言模型已经成为了推动技术创新的重要力量。DeepSeek作为国内领先的大型语言模型提供商,其推出的DeepSeek系列模型在多个领域都展现出了卓越的性能。本文将详细介绍如何使用Spring Boot框架集成DeepSeek API,构建一个简单的AI聊天应用。我们将实现两个核心功能:普通文本生成和流式文本生成。

寻道AI,探索AI无限可能! 2255

上海计算机学会 2023年10月月赛 乙组T4 树的覆盖(树、最小点覆盖、树形dp)

上海计算机学会 2023年10月月赛 乙组T4 树的覆盖(树、最小点覆盖、树形dp)

超哥聊信奥 951

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上海计算机学会2023年8月月赛C++丙组T5方格路径

请统计从左上角的方格出发,有多少种不同的路线可以以最短距离走到右下角。在行走过程中,不能进入地形为墙的方格,保证起点与终点方格地形不是墙。且行走时,只能移动到水平或垂直方向相邻的方格。解析:最短距离可以理解为只能向右或向下,一旦回头,就不是最短路径了。由于方案数可能很大,输出模 1,000,000,007 的余数。可以用递推法,当前格的方案数为上方格方案数加左边格方案数。内存限制: 256 Mb时间限制: 1000 ms。

长春高老师编程 648

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上海计算机学会2023年1月月赛C++丙组T5积木染色(二)题解

n块积木排成一排,需要给每块积木染色,颜色有m种。请问有多少种方法,从第二块积木开始统计,恰有p块积木与前一块积木颜色不同?

长春高老师编程 818

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上海市计算机学会竞赛平台2023年5月月赛

从1开始,挨个在原数后面加0或1,用余数定理算余数,同时用余数作剪枝(因为题目要求最小倍数,所以就不用搜这个数,同时深搜就不可行),一直搜到余数为0为止,但是为了输出,用于宽搜的队列还要有父节点的编号与本身的选择(0或1)。给定一个长度为 n 的排列,每次操作,你可以选择其中一个数字,并将它放到开头或结尾,请问最少多少次操作,才能使该排列变为升序?特别注意,若 n 是奇数,则在翻转变换下,(n+1)/2 号位置上的演员位置不变。这题先存图,然后dfs搜索目的地路径,然后“打卡”,思路简单。

GaoGuohao2022的博客 703

上海计算机学会2023年12月月赛C++乙组T4擦除序列

解析:使用倒序,最后一个子段和为0,然后从最后擦除的数字开始添加,使用并查集维护子段和,依次找出最大子段和,第1轮:删除第3个数字,得 1 2 X 4 5,此时最大子段和为4+5。第5轮:删除第1个数字,得 X X X X X,此时最大子段和为0。第2轮:删除第5个数字,得 1 2 X 4 X,此时最大子段和为4。第3轮:删除第2个数字,得 1 X X 4 X,此时最大子段和为4。第4轮:删除第4个数字,得 1 X X X X,此时最大子段和为1。内存限制: 256 Mb时间限制: 1000 ms。

长春高老师编程 907

上海市计算机学会乙组月赛题解合集(2020-2026):从“螺旋坐标”到“平衡二叉树”的保姆级刷题路线

本文详细解析了上海市计算机学会乙组月赛(2020-2026)的题目演变与解题策略,涵盖动态规划、树形结构等核心考点。通过系统性的刷题路线和专题突破方法,帮助选手高效提升算法竞赛能力,特别适合中学生和算法初学者参考。

weixin_34195142的博客 326

上海市计算机学会乙组月赛刷题攻略:从“螺旋坐标”到“平衡二叉树”的实战解析

本文详细解析了上海市计算机学会乙组月赛的刷题策略,从基础模拟题如'螺旋坐标'到复杂数据结构题如'平衡二叉树',提供了一套科学的备赛方法。通过题型分类、个性化刷题路径规划和高效题解使用,帮助选手快速提升竞赛能力,适合准备参加乙组月赛的中学生参考。

anuancong1219的博客 396

上海市计算机学会竞赛平台(iai.sh.cn)2023一月月赛(丙组)解题报告

上海市计算机学会竞赛平台(iai.sh.cn)2023一月月赛(丙组)解题报告

Net_bad的博客 2074

上海计算机学会2023年10月月赛C++乙组T3树的连通子图

给定一棵有 n 个结点的树,1 号点为这棵树的根。请计算,这棵树有多少连通子图,由于答案可能很大,输出答案模 1,000,000,007 的余数即可。,是该树的点构成的集合,这些点之间任意两个点的路径上不存在不属于该集合的点。含根的用其所有子树中含根子图数量用乘法原理,不含根的用其所有子树中含根不含根的子图用加法原理。此题事一个树上dp,对于每个子树,计算其含有根节点的连通子图数量和不含根的子图数量。内存限制: 256 Mb时间限制: 1000 ms。

长春高老师编程 441

上海计算机学会2023年7月月赛C++乙组T4积木染色(三)

现有由 n 块小积木拼成的一个长条积木,从左到右的小积木编号依次为 1..n,其中第 i 块小积木的颜色为 ci​。计算任意区间:dpij 的最小花费,ai==aj dpij=min (dpi+1j ,dpij-1)枚举长度len,枚举起始位置i(终止位置j=i+len-1),枚举分割点k(包头不包尾) ,三重循环 ,长度len,起始位置i(计算终止位置j=i+len-1),分割位置k。思路 寻找 区间[i,j]合并的最小花费,默认自己与自己花费为1次dpii=1,因为自己与自己相等不需要花费1次,

长春高老师编程 587

上海计算机学会2023年8月月赛C++乙组T4极值的和

对于在(l,r)区间的最大值x,若x的位置是t,我们可以分析出,其是(t-l)*(r-t)个组合的最大值,我们只要找到每一个数的最大值区间就可以了。我们可以采用单调队列来找到每一个数作为最大值的(l,r)区间。给定一个序列 a1​,a2​,a3​,…,an​,请求出该序列每一个连续子序列的最大值,并计算这些最大值的和。内存限制: 256 Mb时间限制: 1000 ms。

长春高老师编程 357

上海计算机学会2023年6月月赛C++乙组T4单词解密

小爱发明了一套对字母的加密系统,其本质就是用字母在字典序中的编号来代替该字母。 例如,单词iai,i是第9个字母,a是第1个字母,因此iai经过加密后,得到的密文为919。 但是小爱发现,这样加密后的信息,可能会有多种解读,密文为919除了iai还可以是is,因此在解密时,有两种可能性。 现在,小爱给你一串密文,请你帮助小爱计算出所有可能的明文的种数%1000000007。

长春高老师编程 515
上一篇: 上海计算机学会 2023年12月月赛 丙组T4 迷宫(宽度优先搜索)
下一篇: 上海计算机学会 2023年11月月赛 乙组T1 连接数字(字符串 贪心)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值