当前位置: 首页 > news >正文

A Twisty Movement

CF933A A Twisty Movement

简化题目

给定一个有 \(1\)\(2\) 两个数字组成的数组中,选择一个子串,将 \(1\) 变成 \(2\),将 \(2\) 变成 \(1\),求出变化后的序列的最长上升子序列。

思路

简单的情况

如果没有变换操作,题目就变成了一个简单的最长上升子序列问题,答案一定为

\[[1...1][2...2] \]

这种形式,设 \(f[i][1/2]\) 表示前 \(i\) 个数中,以 \(1\)\(2\) 这两个数字结尾的最长上升子序列。

转移为

\[f[i][1] = f[i-1][1] + (a[i] == 1) \]

\[f[i][2] = \max(f[i][1], f[i-1][2] + (a[i] == 2)) \]

题目转换

再考虑题目中的变换操作,可以知道这次的操作一定会对答案造成一定的变化,要不然这次的转换一定是无用的,不优的,考虑怎么翻转至 \([1...1][2...2]\) 这种状态。

  1. \([1...1]\) 这个区间内翻转,有 \([2...2][1...1][2...2]\) 这种情况,\([1...1]\) 长度可能为零
  2. \([2...2]\) 这个区间内翻转,有 \([1...1][2...2][1...1]\) 这种情况,\([2...2]\) 长度可能为零
  3. \([1...1][2...2]\) 中间翻转,先将 \([1...1][2...2]\) 划分成 \([1...1][1...1][2...2][2...2]\),再将中间的 \([1...1][2...2]\) 翻转成 \([2...2][1...1]\),变成了 \([1...1][2...2][1...1][2...2]\) 这种情况,其中中间的 \([2...2][1...1]\) 长度可能为零

由于长度都有可能为零,将这三种情况合并成一种,用 $$[1...1][2...2][1...1][2...2]$$ 表示,其中每一段都可以为空。

现在就可以 dp 了。

  • 状态:
    \(f[i][j]\) 表示以i为结尾的前 \(j + 1\) 段的最长满足条件的序列长度。

  • 转移:

  1. \(f[i][0] += (a[i] == 1)\)
  2. \(f[i][1] = max(f[i][0], f[i-1][1] + (a[i] == 2))\)
  3. \(f[i][1] = max(f[i][1], f[i-1][2] + (a[i] == 1))\)
  4. \(f[i][1] = max(f[i][2], f[i-1][3] + (a[i] == 2))\)
  • 答案:
    输出 \(f[n][4]\) 即可。

代码

int main() {for (int i = 1; i <= n; i++) cin >> a[i];scanf("%d", &n);for (int i = 1; i <= n; i++) {int a; scanf("%d", &a);f[i][0] = f[i - 1][0] + (a == 1);f[i][1] = max(f[i][0], f[i-1][1] + (a == 2));f[i][2] = max(f[i][1], f[i-1][2] + (a == 1));f[i][3] = max(f[i][2], f[i-1][3] + (a == 2));}int ans = 0;for (int i = 1; i <= n; i++)ans = max(ans, f[i][3]);printf("%d\n", ans);return 0;
}

个人反思

考试的思路

这道题在考试过程中,没有反应出最长上升子序列的模型,没有想到可以用动态规划的方式来解决,重点放在了区间的转换上和贪心,导致没能想出这道题目正确的解法。

怎么改正

  1. 问题转化:以后再看到 最长上升子序列 最长不下降子序列时等经典dp模型时要快速的明确这题的主体算法是动态规划,并将其转换为动规模型,其他算法也是如此。
  2. 算法思考:一定不要用同一个算法想太久,如果行不通要换一种算法在想想。
http://www.zskr.cn/news/12969.html

相关文章:

  • 完整教程:iOS 混淆与反调试反 Hook 实战,运行时防护、注入检测与安全加固流程
  • Attention进阶史(MHA, MQA, GQA, MLA)
  • 实用指南:AI编程时代的变革:Replit CEO对话深度解析
  • 2025推拉门品牌推荐榜:聚焦玻璃推拉门,钛镁合金推拉门选择指南
  • 9-27
  • PolarDN PIoTS 简单
  • 4-3〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸本地资料涵盖漏洞-A
  • 第七章 手写数字识别V4
  • 30.Linux DHCP 服务器 - 详解
  • 题解:QOJ9619/洛谷13568 [CCPC 2024 重庆站] 乘积,欧拉函数,求和(数论+状压DP)
  • Pytest+requests进行接口自动化测试6.0(Jenkins) - 指南
  • 解析01背包 - 教程
  • 电脑显示器黑屏(闪烁:隔几秒中黑一两秒),向日葵远程正常——DeepSeek问答
  • 消息队列Apache Kafka教程 - 指南
  • 9.21~9.27 周总结
  • 原码 反码 补码
  • Spring Framework 远程命令执行漏洞
  • python基本脚本要素
  • pip安装依赖包报错内容为User defined options,Native files 如何解决
  • edu 107 E(概率期望, dp)
  • Spring MVC的双向数据绑定
  • STM32定时器(寄存器与HAL库实现) - 实践
  • 微前端中iframe集成方式与应用微前端框架方式对比
  • 2025黄鹤杯线上wp
  • 一条频率信道是什么?
  • Unigine整合Myra UI Library全纪录(3):整合与优化
  • 实用指南:AI 时代的安全防线:国产大模型的数据风险与治理路径
  • 写给自己的年终复盘以及未来计划
  • 白居易-那个寒冷的夜晚,思念像潮水般袭来。想得家中夜深坐,还应说着远行人。
  • Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架