ABC391E题解
大概评级:绿。
题目传送门。
显然动态规划,设 \(f_{i,k}\) 表示经过 \(i\) 次变换后能将 \(a_k\) 取反的最大值,显然答案为 \(f_{n,1}\),状态转移很简单,枚举 \(i\) 和 \(k\),我们肯定是从 \(f_{i-1,x}\) 转移过来的,\(x\) 可以取什么值呢,想想合并的过程,从 \(i-1\) 次变换到第 \(i\) 次变换,区别在于将 \(i-1\) 次变换后的 \(a_{3k-2},a_{3k-1},a_{3k}\) 再次合并,得到第 \(i\) 次变换的结果,所以 \(x\) 的取值只能是 \(3k-2,3k-1,3k\),当然,这里不需要枚举 \(x\),我们只需要看第 \(i-1\) 次变换后的这三个位置,进行分类讨论即可。设 \(one = 3k-2,two = 3k-1,three = 3k\),注意,我们每次遍历 \(i\) 时,都得准备一个数组 \(A\) 表示第 \(i-1\) 次变换后的 \(a\),则状态转移为:如果 \(A_{one} = A_{two}\) 并且 \(A_{two} = A_{three}\),说明此时三个数相等,那么 \(f_{i,k} = f_{i-1,one}+f_{i-1,two}+f_{i-1,three}-\max\left\{f_{i-1,one},f_{i-1,two},f_{i-1,three}\right\}\),其实就是当三个位置的数全部相等时,我们想要取反,那得取反这三个位置中的两个数才行,那肯定是取两个 \(f\) 值最小的改变合并后的结果,由于第二小不太好整,我们就拿总和减去 \(f\) 值最大的那个位置就可以了,第二种情况是如果 \(A_{one} = A_{two}\) 但是 \(A_{two} \not= A_{three}\),那么只需要找 \(two\) 或 \(one\) 这两个位置随便一个位置取反就行了,也就是 \(f_{i,k} = \min(f_{i-1,one},f_{i-1,two})\),然后第三种情况 \(A_{one} = A_{three}\) 但是 \(A_{three} \not= A_{two}\),跟上一种情况差不多,\(f_{i,k} = \min(f_{i-1,one},f_{i-1,three})\),最后一种情况也是一样的,就是如果 \(A_{two} = A_{three}\) 但是 \(A_{three} \not= A_{one}\),也是一样的,\(f_{i,k} = \min(f_{i-1,two},f_{i-1,three})\)。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1594328;
char a[N];
char b[N];
int f[18][N];
signed main()
{
int n;
scanf("%d",&n);
scanf("%s",a+1);
int m = pow(3,n);
for(int i = 1;i<=m;i++)
{
f[0][i] = 1;
}
int num = 1;
for(int i = 1;i<=n;i++)
{
num*=3;
int mm = m/num;
for(int j = 1;j<=mm;j++)
{
int one = 3*j-2,two = 3*j-1,three = 3*j;
if(a[one] == a[two]&&a[two] == a[three])
{
b[j] = a[one];
f[i][j] = f[i-1][one]+f[i-1][two]+f[i-1][three]-max(max(f[i-1][one],f[i-1][two]),f[i-1][three]);
}
else
{
if(a[one] == a[two])
{
b[j] = a[one];
f[i][j] = min(f[i-1][one],f[i-1][two]);
}
else if(a[one] == a[three])
{
b[j] = a[one];
f[i][j] = min(f[i-1][one],f[i-1][three]);
}
else
{
b[j] = a[two];
f[i][j] = min(f[i-1][two],f[i-1][three]);
}
}
}
for(int j = 1;j<=mm;j++)
{
a[j] = b[j];
}
}
printf("%d",f[n][1]);
return 0;
}
ABC391E题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 打破格式壁垒 !COS助力腾讯文档优化在线预览效果
说起腾讯文档,相信大家对此并不陌生.在新冠疫情防控期间,腾讯文档在人员流动排查.健康信息收集.居家学习.协同办公等场景发挥了巨大的作用. 腾讯文档不仅支持新建word.excel.ppt.思维导图.流 ...
- 使用 Autofac, MediatR 和 FluentValidator 构建松耦合 ASP.NET Core API 应用
使用 MediatR 和 FluentValidator 1. 创建示例文件夹 Sample 首先,创建示例文件夹 Sample. 2. 创建表示层项目 Web 在示例文件夹 Sample 中,使用标 ...
- zz 失血模型与充血模型等
失血模型与充血模型 | 三秋 (贫血模型)优点是系统的层次结构清楚,各层之间单向依赖,Client->(BusinessFacade)->BusinessLogic->Data Ac ...
- django模型层(orm相关知识点)
目录 一.模型层之前期准备 模型层的了解 模型 模型层的前置知识点 二.ORM常用关键字 三.ORM执行SQL语句 四.神奇的双下划线查询 五.ORM外键字段的创建 复习MySQL外键关系 外键字段的 ...
- nginx jupyterWeb
location /jupyterWeb/ { add_header X-Frame-Options SAMEORIGIN; add_header Access-Control-Allow-Origi ...
- java -jar命令运行jar包时指定外部依赖jar包
你们都知道一个java应用项目能够打包成一个jar,固然你必须指定一个拥有main函数的main class做为你这个jar包的程序入口.具体的方法是修改jar包内目录META-INF下的MANIFE ...
- Qt/C++编写跨平台的推流工具(支持win/linux/mac/嵌入式linux/安卓等)
一.前言 跨平台的推流工具当属OBS最牛逼,功能也是最强大的,唯一的遗憾就是多路推流需要用到插件,而且CPU占用比较高,默认OBS的规则是将对应画布中的视频画面和设定的音频一起重新编码再推流,意味着肯 ...
- PostgreSQL 数据库的启动与停止管理
title: PostgreSQL 数据库的启动与停止管理 date: 2024/12/28 updated: 2024/12/28 author: cmdragon excerpt: 作为一个强大的 ...
- MySQL数据库建库时SQL语句中数据库名、表名用引号的问题以及COLLATE utf8_general_ci的含义
一.MySQL数据库建库时SQL语句中数据库名.表名用引号的问题解释:在创建MySQL数据库和表时,数据库名.表名和字段名外面的符号 ` 不是单引号,而是英文输入法的反单引号,同键盘~同一位置.为了避 ...
- 使用Redis防止重复发送RabbitMQ消息
问题 今天遇到一个问题,发送MQ消息的时候需要保证不会重复发送,注意不是可靠到达(可靠到达可以通过消息确认机制和回调接口保证),这里保证的是不会生产多条一样的消息. 方法 综合讨论下来决定使用Redi ...