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%g​ci​,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 **相关推荐

  1. ZOJ - 4114 Flipping Game(dp+组合数学)

    题目链接:点击查看 题目大意:给出一个长度为 n 的 01 字符串表示 n 个灯泡的状态,1 为点亮,0 为熄灭,现在需要进行 k 轮操作,每轮操作可以选择恰好 m 个位置,将灯泡的状态置反,现在给出 ...

  2. CF #768 F.Flipping Range

  3. 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 的数列也是可以翻转的. 根据辗转相 ...

  4. leetcode 403. 青蛙过河(dp)

    一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子,但是不可以跳入水中. 给你石子的位置列表 stones(用单元格序号 升 ...

  5. leetcode 368. 最大整除子集(dp)

    给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % ...

  6. 算法套路十七——买卖股票问题:状态机 DP

    算法套路十七--买卖股票问题:状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机(Finite State Machine)的问题求解方法. 状态机DP(State Machine DP)是 ...

  7. Codeforces Round#768(Div.2)A-F

    A. Min Max Swap 题意 给定两个数组a.b,可以任意的交换ai .bi.使得max(a1,a2,-,an)⋅max(b1,b2,-,bn) 的值最小 题解: 1.从全局来考虑,由于只是改 ...

  8. go语言定义二维数组

    使用go语言二维数组 go语言不用管理内存,很多地方使用起来确实很方便,但是在算法方面确实没有C++优秀,特别是缺少像STL一样优秀模板,定义一个二维数组需要进行如下复杂的操作: go语言的二维数组定 ...

  9. 最小编辑代价-golang

    题目: 给定两个字符串str1和str2,在给定三个整数ic,dc和rc,分别代表插入.删除和替换一个 字符,返回将str1编辑成str2的最小代价. 解题方法: 动态规划.首先生成大小为(M+1)X ...

最新文章

  1. 20w7珠led驱动电源电路图_LED驱动电源:用TL431做的几个恒流电路分享!
  2. Python enumerate 函数 - Python零基础入门教程
  3. 学习Spring Boot:(五)使用 devtools热部署
  4. static变量 java
  5. mysql ddl分类_MySQL语言分类——DDL
  6. VB提取字符串中的日期
  7. Semantic Analysis
  8. 怎么让电脑运行速度变快_加快电脑运行速度的6个秘笈,系统安装,电脑维修必备技巧...
  9. 海湾监控计算机,海湾GST-DH9300电气火灾监控图形显示系统软件
  10. weblogic使用脚本部署
  11. chainmaker 交易执行失败也会打包到区块 落盘
  12. 第22篇 项目进度管理__计划评审技术__重点内容
  13. 苹果新功能之Continuity Camera连续性摄像头,是拯救者还是革新者
  14. Windows下学习C语言有哪些集成开发软件?
  15. Drop user与cascade
  16. java 逗号分隔数字_java程序 输入n个数字,以逗号隔开,然后升序排列,再重新输出...
  17. Unknown column 'JOIN.id' in 'order clause'和 Unknown column 'XXXX.id' in 'order clause'的解决办法
  18. 使用moment计算两个日期的相差天数
  19. MySQL数据库——初识MySQL
  20. Hack The Box 注册教程

热门文章

  1. OpenCV-FLANN识别
  2. 【python】Flask
  3. 在ts文件中引入js模块,编写声明文件的方法
  4. python批量下载网页图片,不用再复制粘贴了(7)
  5. 百度地图整合离线和使用
  6. 14种主流的RTOS 单片机操作系统~来学!
  7. 谷歌如何注册账号?手机号无法验证处理方法!2023年最新教程!
  8. Abp mysql guid_使用ABP框架踩过的坑系列5
  9. SISR深度学习主要方法简述
  10. Linux系统:我们的征途是星辰大海!