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 ...
随机推荐
- GraphQL Part III: 依赖注入
在 SOLID 设计原则中,D 表示依赖反转原则 高层组件不应该依赖于底层组件,双方应该基于抽象 抽象不应该依赖于实现,实现应该依赖于抽象 使用 new 操作符来创建对象实例会导致不同组件之间的紧耦合 ...
- 2024年1月Java项目开发指南14:关于post中的body和param以及java中的@RequestBody和@RequestParam
在HTTP请求中,POST方法通常用于向服务器发送数据,这些数据可以在请求的body中,也可以在URL的param中.不过,这两者的使用方式和适用场景是不同的. Body:在POST请求中,body主 ...
- Qt支持RKMPP硬解的视频监控系统/性能卓越界面精美/实时性好延迟低/录像存储和回放/云台控制
一.前言 之前做的监控系统,已经实现了在windows上硬解码比如dxva2和d3d11va,后续又增加了linux上的硬解vdpau的支持,这几种方式都是跨系统的硬解实现方案,也是就是如果都是win ...
- Qt音视频开发系列文章导航
文章 链接 1-vlc解码播放 https://qtchina.blog.csdn.net/article/details/107742836 2-vlc回调处理 https://qtchina.bl ...
- MySql中MySqlParameter的用法
在C#中,向表person插入一条数据(表person包括两列:id和name),使用MySqlParameter定义表中各列的值. static void Main(string[] args) { ...
- 即时通讯技术文集(第43期):直播技术合集(Part3) [共13篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 43 期. [-1-] 直播系统聊天技术(一):百万在线的美拍直播弹幕系统的实时推送技术实践 ...
- ConcurrentHashMap源码分析-JDK18
前言 ConcurrentHashMap是一个线程安全的HashMap,主要用于解决HashMap中并发问题. 在ConcurrentHashMap之前,也有线程安全的HashMap,比如HashTa ...
- Solution -「ROI 2018」「LOJ #2850」无进位加法
\(\mathscr{Description}\) Link. 给定 \(\{a_n\}\),每次令某个 \(a_i\leftarrow a_i+1\),最终得到 \(\{b_n\}\),求 ...
- 一步一步abp电商模块-1、搭建模块环境
前言 目前在开发abp电商模块,打算做一步,写一步,算是对自己的记录,主要是参考nopcommoner 并结合abp模块开发 知识都是连贯的,如果你熟悉asp.net core 3.x.abp(非vN ...
- 阿里云-对象存储OSS
https://help.aliyun.com/product/31815.html 阿里云对象存储OSS(Object Storage Service)是一款海量.安全.低成本.高可靠的云存储服务, ...