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 ...
随机推荐
- node-koa2 微信支付-企业付款到银行卡
微信支付用的V2版本 微信支付说明文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay_yhk.php?chapter=24_2 参数详细 ...
- legend不显示
legend写了对应的data,在series需要填写对应的name
- Avalonia 国际化之路:Resx 资源文件的深度应用与探索
在当今全球化的软件开发浪潮中,应用的国际化(i18n)与本地化(L10n)显得尤为重要.Avalonia UI 作为一款强大的跨平台 UI 框架,为开发者提供了多种实现国际化的途径.其中,使用传统的 ...
- 探索使用 ViewContainerRef 的 Angular DOM 操控技术
探索使用 ViewContainerRef 的 Angular DOM 操控技术 https://indepth.dev/posts/1052/exploring-angular-dom-manipu ...
- Linux 虚拟机重启找不到IP解决方案
@ 目录 前言 简介 Linux 操作系统查看不到IP地址 问题描述: 第一步 :修改配置 第二步 :查看ip 第三步 :查看网卡 第四步 :重启网络 Linux 网络服务重启失败解决办法 问题描述 ...
- 阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化
本文由阿里闲鱼技术团队逸昂分享,原题"消息链路优化之弱感知链路优化",有修订和改动,感谢作者的分享. 1.引言 闲鱼的IM消息系统作为买家与卖家的沟通工具,增进理解.促进信任,对闲 ...
- Python 并发编程实战:优雅地使用 concurrent.futures
在 Python 多线程编程中,concurrent.futures 模块提供了一个高层的接口来异步执行可调用对象.今天,我们将通过一个循序渐进的案例,深入了解如何使用这个强大的工具. 从一个模拟场景 ...
- VSTO踩坑记录(3)- 用ClickOnce发布outlook插件 - 我数据文件呢?
概述 上面两篇文章虽然很简略,不过vsto说白了就是winform开发,所以需要说的内容不是很多,下面直接到发布阶段. 这次先介绍ClickOnce的发布方式,默认右击项目 - 发布,就是这种方式. ...
- ESP8266 wifi模块+CH340烧录板安装使用运行教程
硬件准备 ESP8266-01S 模块 USB转TTL烧录板(CH340) LED灯(建议使用3.3V LED) 220Ω电阻(LED限流) 面包板和跳线若干 我的是这样的不用接线,其他的参考 ESP ...
- uwp 图片剪切
public async void BitmapTransformAndSaveTest() { var uncroppedfile = await Windows.Storage.Applicati ...