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

CF1385D a-Good String

原题链接:Problem - 1385D - Codeforces

这是一道好题,本质上是使用动态规划(分治)去处理每个区间。DP 本身是很简单的,难点在于范围处理和时间的估计。本身是没什么难度的,只是范围有些复杂,容易算错,这时候就建议列表去发现规律了。

列表是一种快速,不易错的数据统筹方式,可以方便对范围进行控制找寻。多设点 \(len\) 变量吧。

就不多说了,是一道练习区间范围基本功的好题,练习代码实现能力。自己试试吧。

预处理:

/*
列表,定点,定长度,找点的魅力
*/#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;const int N = 50, M = 140010 * 2;int n, m;
int f[N][M], sum[N][M];
string s;int main()
{int T;cin >> T;while (T -- ){cin >> n >> s;m = log2(n);for (int j = 1; j <= m + 1; j ++ ){char x = 'a' + j - 1;for (int i = 1; i <= n; i ++ ){if (x != s[i - 1]) sum[j][i] = 1;else sum[j][i] = 0;sum[j][i] += sum[j][i - 1];}}for (int i = 1; i <= n; i ++ ) f[m + 1][i] = sum[m + 1][i] - sum[m + 1][i - 1];for (int i = m; i >= 0; i -- )for (int j = 1; j <= 1 << i - 1; j ++ )f[i][j] = min(f[i + 1][j * 2 - 1] - sum[i][(2 * j - 1) * (1 << m - i)] + sum[i][(2 * j) * (1 << m - i) ], f[i + 1][j * 2] - sum[i][(2 * j - 2) * (1 << m - i)] + sum[i][(2 * j - 1) * (1 << m - i)]);cout << f[1][1] << endl;}return 0;
}

在线处理(实际上最后算出来还是 \(n\log n\) 的计算数量 ),而非 \(\operatorname O(n^2\log n)\)

/*
定点,定长度
*/#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;const int N = 50, M = 140010 * 2;int n, m;
int f[N][M];
string s;int get(int x, int l, int r) // 在线计算区间内需要转换的点的数量
{int cnt = 0;for (int i = l - 1; i < r; i ++ ){char a = 'a' + x - 1;if (a != s[i]) cnt ++ ;}return cnt;
}int main()
{int T;cin >> T;while (T -- ){cin >> n >> s;m = log2(n);// m ++ ;for (int i = 1; i <= n; i ++ ) f[m + 1][i] = get(m + 1, i, i);for (int i = m; i >= 0; i -- )for (int j = 1; j <= 1 << i - 1; j ++ )f[i][j] = min(f[i + 1][j * 2 - 1] + get(i, (2 * j - 1) * (1 << m - i) + 1, (2 * j) * (1 << m - i)), f[i + 1][j * 2] + get(i, (2 * j - 2) * (1 << m - i) + 1, (2 * j - 1) * (1 << m - i)));cout << f[1][1] << endl;}return 0;
}
http://www.hskmm.com/?act=detail&tid=18327

相关文章:

  • 9月23日(日记里有)
  • 9月25日(日记里有)
  • Git 提交代码前,一定要做的两件事
  • 本地调试接口时遇到的跨域问题,十分钟解决
  • 用 Excel 快速处理接口返回的 JSON 数据
  • 调度的基本概念
  • Overleaf项目文件同步工具: olsync
  • CF1995D Cases
  • 日志| 编辑距离 | 最长有效括号 |
  • day5
  • 《etcd库——键值存储系统》 - 教程
  • 有一个函数只会返回0和1,且返回0和返回1的概率不等。要求只能通过这个函数生成一个等概率返回0和1的函数
  • AI智能体开发实战:17种核心架构模式详解与Python代码实现
  • 代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、删除字符串中的所有相邻重复项
  • 2025.9.26总结 - A
  • MySQL性能优化
  • 关于“悬荡悟空”决策机制的简要技术说明
  • 最小二乘问题详解1:线性最小二乘
  • 9月26日
  • 工程监理行业多模态视觉​​​​​​​大模型系统,打造工地行业全场景的监理智能生态
  • 完整教程:【鸿蒙心迹】摸蓝图,打地基
  • 正则表达式
  • LuatOS Air780EPM 实现 HTTP 通信:从原理到代码实践
  • 搜维尔科技:Senseglove Nova 2触觉手套:虚拟训练、VR/AR模拟和研究中的触觉反馈
  • 深入解析:盟接之桥EDI软件:中国制造全球化进程中的连接挑战与路径探索
  • 【STM32H7】基于CubeMX从零开始搭建的HAL库工程模板(包含串口重定向和DSP库)
  • 在Windows架构中安装Miniforge及python环境变量配置
  • 搜维尔科技:Force Dimension Omega力反馈设备遥操作工业机器人
  • 3. Ollama 安装,流式输出,多模态,思考模型 - Rainbow
  • C++程序练习(部分未完全完成)