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 ...
随机推荐
- 【C#】接口的基本概念
目录 基本 什么是接口 接口与抽象类的区别 抽象类 接口 实例 设计接口 基本 什么是接口 C#接口(interface)是:用来定义一种程序的协定 实现接口的类或者结构要与接口的定义严格一致. 有了 ...
- shell学习之路——取参数
shell中参数的调用方式: 1.$0-9:表示第0个到第9个参数,其中$0表示文件执行路径.如:$0,$1. 2.${10以后}:如果参数数目大于9个,可以用${10},${11}...等方式表示. ...
- Qt/C++音视频开发79-采集websocket视频流/打开ws开头的地址/音视频同步/保存到MP4文件/视频回放
一.前言 随着音视频的爆发式的增长,各种推拉流应用场景应运而生,基本上都要求各个端都能查看实时视频流,比如PC端.手机端.网页端,在网页端用websocket来接收并解码实时视频流显示,是一个非常常规 ...
- Qt编写可视化大屏电子看板系统23-模块1产量汇总
一.前言 大屏系统采用结构模块化的分层设计思路,一个表对应一个最小模块比如模具产量.零件产量,数据库采集的时候采集对应的表,拿到数据后按照对应的数据规则传给控件绘制,其中模具产量.零件产量两个模块采用 ...
- Qt编写的项目作品22-自定义委托全家桶
一.功能特点 可设置多种委托类型,例如复选框/文本框/下拉框/日期框/微调框/进度条等. 可设置是否密文显示,一般用于文本框. 可设置是否允许编辑,一般用于下拉框. 可设置是否禁用,一般用来禁用某列. ...
- 一个超经典 WinForm,WPF 卡死问题的终极反思
一:背景 1. 讲故事 写这篇文章起源于训练营里一位朋友最近在微信聊到他对这个问题使用了一种非常切实可行,简单粗暴的方式,并且也成功解决了公司里几个这样的卡死dump,如今在公司已是灵魂级人物,让我也 ...
- Spring Cloud认知学习(三):网关Zuul、config使用
目录 zuul 作用: 简单示例: 0.创建模块 1.导入依赖: 2.主程序增加注解: 3.配置application.yml: 4.测试 配置语法: 路由 补充: 上一篇介绍一个新的组件Hystri ...
- Linux 提权指南
知屋漏者在宇下,知政失者在草野,知经误者在诸子. 导航 壹 - 密码搜寻 贰 - Sudo 命令 叁 - SUID/SGID 特权 肆 - 计划任务 伍 - 文件/目录 陆 - Linux 内核 柒 ...
- 使用坦克PWA访问助手为自己的局域网应用快速配置免费域名
这篇教程描述如何使用坦克PWA访问助手.这篇文章简称坦克PWA访问助手为PWA助手.PWA结合了DNS服务器技术和HTTP服务器技术实现,因此它需要系统的53端口和80端口.所以,如果你的电脑有程序占 ...
- manim边做边学--交替变换
今天,我们将介绍 Manim 中两个用于交替变换的动画类:CyclicReplace 和 Swap. 无论是在展示数学概念的动态变化,还是在图形设计中呈现元素的巧妙交互,这两个动画类都扮演着重要角色. ...