CF1631F. Flipping Range dp **
link
dp, 2400,非常妙的一道题目
类似这种每次操作都是对连续 k k k 位进行的不妨用对位置取模的dp
题意
给定数组 a a a 和集合 B B B,你可以进行如下操作任意多次(可以为0次): ∀ x ∈ B , 翻 转 数 组 a 中 连 续 的 x 位 , 同 一 个 x 也 可 以 多 次 取 出 \forall x\in B,翻转数组a中连续的x位,同一个x也可以多次取出 ∀x∈B,翻转数组a中连续的x位,同一个x也可以多次取出
问: m a x Σ a i max\space \Sigma a_i max Σai
思路
首先假设 x , y ∈ B ( x > y ) x,y\in B(x > y) x,y∈B(x>y),则我们可以把任意一个长度为x-y的区间翻转,容易得到翻转的最小长度即为g=gcd(b1,b2,...bn)
,所以问题简化为了:
给定 a , g a,g a,g,每次操作可以翻转数组 a a a 中连续的 g g g 位,求 m a x Σ a max\space\Sigma a max Σa
构造一个数列 c c c ,若最后 a i a_i ai 乘了-1,则 c i = 1 c_i=1 ci=1,否则 c i = 0 。 c_i=0。 ci=0。
设 f x = ⨁ i % g c i , x ∈ [ 0 , g − 1 ] f_x=\bigoplus_{i\%g}c_i,x\in [0,g-1] fx=⨁i%gci,x∈[0,g−1],由于是翻转连续的g位,所以每次操作相当于 ∀ x ∈ [ 0 , g − 1 ] , f x = f x ⨁ 1 \forall x\in[0,g-1],f_x = f_x\bigoplus1 ∀x∈[0,g−1],fx=fx⨁1也就是无论怎样变换,所有的 f x f_x fx 都是相等的,同为1or同为0。
另一方面,我们也可以通过变换得到任意一个 f x f_x fx 相等的局面,所以f_x均为1或0是一个序列合法的等价条件
以此进行dp。
设dp[i][1/0]
表示当前进行到第 i i i 位,且进行了1/0(奇/偶次)变换后得到的 a i + a i − g + . . . a_i+a_{i-g}+... ai+ai−g+...最大值。最后的答案就是1/0
中大的那个。
int n, m;
int gcd(int a, int b) {if(!b) return a;return gcd(b, a % b);
}
int a[maxn];
ll dp[maxn][2];//dp[i][0]表示(i+1)%g位置共操作偶数次 [i][1]表示共操作奇数次
void solve() {cin >> n >> m;for(int i = 1; i <= n; i++) {cin >> a[i];}int g = 0;while(m--) {int x;cin >> x;g = gcd(g, x);}// cout << g << endl;for(int i = 1; i <= g; i++) {dp[i][1] = -a[i];dp[i][0] = a[i];}for(int i = g + 1; i <= n; i++) {dp[i][1] = max(dp[i-g][0] - a[i], dp[i-g][1] + a[i]);dp[i][0] = max(dp[i-g][1] - a[i], dp[i-g][0] + a[i]);}ll sum1 = 0, sum0 = 0;for(int i = n-g+1; i <= n; i++) {sum1 += dp[i][1];sum0 += dp[i][0];}cout << max(sum1, sum0) << endl;
}
CF1631F. Flipping Range dp **相关推荐
- ZOJ - 4114 Flipping Game(dp+组合数学)
题目链接:点击查看 题目大意:给出一个长度为 n 的 01 字符串表示 n 个灯泡的状态,1 为点亮,0 为熄灭,现在需要进行 k 轮操作,每轮操作可以选择恰好 m 个位置,将灯泡的状态置反,现在给出 ...
- CF #768 F.Flipping Range
- CF1630D Flipping Range
如果 B B B 中有 x , y x,y x,y ,那么由于 B B B 中的数都不超过 n / 2 n/2 n/2 ,所以对于长度为 x − y x-y x−y 的数列也是可以翻转的. 根据辗转相 ...
- leetcode 403. 青蛙过河(dp)
一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子,但是不可以跳入水中. 给你石子的位置列表 stones(用单元格序号 升 ...
- leetcode 368. 最大整除子集(dp)
给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % ...
- 算法套路十七——买卖股票问题:状态机 DP
算法套路十七--买卖股票问题:状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机(Finite State Machine)的问题求解方法. 状态机DP(State Machine DP)是 ...
- Codeforces Round#768(Div.2)A-F
A. Min Max Swap 题意 给定两个数组a.b,可以任意的交换ai .bi.使得max(a1,a2,-,an)⋅max(b1,b2,-,bn) 的值最小 题解: 1.从全局来考虑,由于只是改 ...
- go语言定义二维数组
使用go语言二维数组 go语言不用管理内存,很多地方使用起来确实很方便,但是在算法方面确实没有C++优秀,特别是缺少像STL一样优秀模板,定义一个二维数组需要进行如下复杂的操作: go语言的二维数组定 ...
- 最小编辑代价-golang
题目: 给定两个字符串str1和str2,在给定三个整数ic,dc和rc,分别代表插入.删除和替换一个 字符,返回将str1编辑成str2的最小代价. 解题方法: 动态规划.首先生成大小为(M+1)X ...
最新文章
- 20w7珠led驱动电源电路图_LED驱动电源:用TL431做的几个恒流电路分享!
- Python enumerate 函数 - Python零基础入门教程
- 学习Spring Boot:(五)使用 devtools热部署
- static变量 java
- mysql ddl分类_MySQL语言分类——DDL
- VB提取字符串中的日期
- Semantic Analysis
- 怎么让电脑运行速度变快_加快电脑运行速度的6个秘笈,系统安装,电脑维修必备技巧...
- 海湾监控计算机,海湾GST-DH9300电气火灾监控图形显示系统软件
- weblogic使用脚本部署
- chainmaker 交易执行失败也会打包到区块 落盘
- 第22篇 项目进度管理__计划评审技术__重点内容
- 苹果新功能之Continuity Camera连续性摄像头,是拯救者还是革新者
- Windows下学习C语言有哪些集成开发软件?
- Drop user与cascade
- java 逗号分隔数字_java程序 输入n个数字,以逗号隔开,然后升序排列,再重新输出...
- Unknown column 'JOIN.id' in 'order clause'和 Unknown column 'XXXX.id' in 'order clause'的解决办法
- 使用moment计算两个日期的相差天数
- MySQL数据库——初识MySQL
- Hack The Box 注册教程