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

P3607 [USACO17JAN] Subsequence Reversal P 题解

P3607 [USACO17JAN] Subsequence Reversal P 题解

如果我们顺序对翻转的子序列做 DP,那么在末尾新增一个数会影响前面所有数的交换对应关系。

思考这个翻转的结构,前后对应的数交换,如果我们同时加入前后两个对应的数,就不会影响中间所有数的交换关系。

所以我们考虑区间 DP,\(f_{i, j, x, y}\) 表示只考虑区间 \([i, j]\),其中 LIS 的开头/结尾位置分别是 \(x, y\) 的 LIS 长度。

第一种转移是保留原来的 LIS 不动,直接转移到 \(f_{i - 1,j , x, y}\)\(f_{i, j + 1, x, y}\)

第二种转移是选择 \(i - 1\)\(j + 1\) 作为新 LIS 的一部分,转移到 \(f_{i - 1, j, i - 1, y}\)\(f_{i, j + 1, x, j + 1}\)

第三种转移是翻转 \((i - 1, j + 1)\),转移到 \(f_{i - 1, j + 1, j + 1, i - 1}\) 等。

时间复杂度 \(O(n^4)\)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <ctime>
//#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
typedef long double ld;
const int N = 55;int n, f[N][N][N][N], a[N];signed main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n;for(int i = 1; i <= n; i ++) cin >> a[i];memset(f, -0x3f, sizeof f);for(int i = 1; i <= n; i ++) {f[i][i][i][i] = 1;if(i < n && a[i + 1] <= a[i]) f[i][i + 1][i + 1][i] = 2;}for(int len = 1; len < n; len ++) {for(int i = 1; i + len - 1 <= n; i ++) {int j = i + len - 1;for(int k = i; k <= j; k ++) {for(int p = i; p <= j; p ++) {int t = f[i][j][k][p];f[i - 1][j][k][p] = max(f[i - 1][j][k][p], t);f[i][j + 1][k][p] = max(f[i][j + 1][k][p], t);if(i > 1 && a[i - 1] <= a[k]) f[i - 1][j][i - 1][p] = max(f[i - 1][j][i - 1][p], t + 1);if(j < n && a[j + 1] >= a[p]) f[i][j + 1][k][j + 1] = max(f[i][j + 1][k][j + 1], t + 1);if(i > 1 && j < n) {if(a[i - 1] >= a[p]) f[i - 1][j + 1][k][i - 1] = max(f[i - 1][j + 1][k][i - 1], t + 1);if(a[j + 1] <= a[k]) f[i - 1][j + 1][j + 1][p] = max(f[i - 1][j + 1][j + 1][p], t + 1);if(a[j + 1] <= a[k] && a[i - 1] >= a[p]) f[i - 1][j + 1][j + 1][i - 1] = max(f[i - 1][j + 1][j + 1][i - 1], t + 2);}}}}}int ans = 0;for(int k = 1; k <= n; k ++) for(int p = 1; p <= n; p ++) ans = max(ans, f[1][n][k][p]);cout << ans << '\n';return 0;
}
http://www.gsyq.cn/news/33258.html

相关文章:

  • 随笔/杂记
  • 使用 Swift 解析验证码(结合 Tesseract OCR)
  • 常见排序算法Java实现
  • 175天 隧道技术篇防火墙组策略FRPNPSChiselSocks代理端口映射C2上线
  • link元素的用法及HTML样板
  • 10月28号
  • https://avoid.overfit.cn/post/44c8d547475340d59aa4480f634ea67f
  • Day 18
  • STM32之fromelf生成bin和反汇编文件
  • 常用存储器介绍
  • P11307 [COTS 2016] 建造费 Pristojba 分析
  • 乱学点东西#2 :菠萝/蓝莓/Boruvka算法
  • 文件清理,推荐几款常用软件
  • 【学习笔记】数据结构全家桶
  • 零散点小总结(25.10.28)
  • Top Tree大学习
  • EVE-NG导入华为等镜像的方法
  • 2025 云斗
  • c++ ranges随笔
  • P10259 [COCI 2023/2024 #5] Piratski kod
  • 软考复习总结
  • ? #6
  • 集训做题杂记1 - -MornStar
  • 2019 福建省队集训录
  • 实验二 现代C++编程初体验
  • ZKY精选冲刺省选国赛仿真训练题
  • MySQL 查询与更新语句执行过程深度解析:从原理到实践​ - 指南
  • ZKY精选冲刺省选国赛技巧训练题
  • 价值流智能时代:DevOps平台如何成为企业高效交付的核心引擎? - 教程
  • 2025年压力容器品牌综合实力排行榜