反转 枚举
来源:互联网 发布:淘宝网手机版登录 编辑:程序博客网 时间:2024/06/07 05:02
反转一串字符串,使其一致,问翻转的最小长度和最小次数;枚举法,在求解时优化。
枚举k,用一个f[i]数组表示区间【i,i+k-1】是否进行反转,一个区间进行两次以上反转是多余的;最后看是否还有不一致的情况
#include<iostream>#include<algorithm>#include<string>#include<queue>#include<cmath>#include<vector>#include<stdlib.h>#include<iomanip>#include<list>#include<stack>#include<memory.h>#include<ctype.h>#include<set>#include<map>using namespace std;typedef long long ll;const int maxn = 5000 + 5;int n;int dir[maxn];int f[maxn];int cal(int k) {memset(f, 0, sizeof(f));int ans = 0;int sum = 0;for (int i = 0; i + k <= n; i++) {if ((dir[i] + sum) % 2 != 0) {ans++;f[i] = 1;}sum += f[i];if (i - k + 1 >= 0) {sum -= f[i - k + 1];}}for (int i = n - k + 1; i < n; i++) {if ((dir[i] + sum) % 2 != 0)return -1;if (i - k + 1 >= 0) {sum -= f[i - k + 1];}}return ans;}void solve() {int k = 1, M = n;for (int kk=1; kk <= n; kk++) {int m = cal(kk);if (m >= 0 && M > m) {M = m;k = kk;}}printf("%d %d\n", k, M);}int main() {scanf("%d", &n);char ch;for (int i = 0; i < n; i++) {cin >> ch;if (ch == 'F')dir[i] = 0;else dir[i] = 1;}solve();}
阅读全文
0 0
- 反转 枚举
- 矩阵反转 枚举
- POJ 3279 Fliptile 反转 (二进制枚举)
- poj 1222 反转问题 枚举(0ms 过)
- 反转
- POJ 1222 EXTENDED LIGHTS OUT(矩阵反转问题——枚举or高斯消元)
- 2017省选拔(三)poj 1222 EXTENDED LIGHTS OUT (状态压缩+枚举反转)
- [C/C++标准库]_[初级]_[移除反转枚举reverse_iterator]
- 枚举
- 枚举
- 枚举
- 枚举
- 枚举
- 枚举
- 枚举
- 枚举
- 枚举
- 枚举
- linux命令--chown
- LNMP状态管理命令
- GetMapping 和 PostMapping
- java中的工具类
- Matlab——SCARA机器人
- 反转 枚举
- 一个按钮触发另一个按钮
- 练习赛一 B 朴素的中位数
- 服务端获取客户端的真实ip
- linux中sudo的用法和sudoers配置详解
- 如何在迁移到微服务时避免共同的挑战
- 如何从网页代码中看出一个元素到浏览器顶端的距离?
- OpenCV学习笔记(二)
- flex布局