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

P3147 [USACO16OPEN] 262144 P

题目

P3147 [USACO16OPEN] 262144 P

算法标签: 动态规划, 线性 d p dp dp, 贪心, 区间 d p dp dp

思路

定义状态表示 f [ i ] [ j ] f[i][j] f[i][j]表示左边界是 i i i并且合并出的最大值是 j j j的右边界是什么位置(开区间), k k k区间覆盖的是 [ i , f [ i ] [ j ] − 1 ] [i, f[i][j] - 1] [i,f[i][j]1], 如何进行状态转移?
如果当前状态 f [ i ] [ k ] = 0 f[i][k] = 0 f[i][k]=0, 可以尝试合并两个 k − 1 k - 1 k1达到当前状态, 设 r = f [ i ] [ k − 1 ] r = f[i][k - 1] r=f[i][k1], 那么 f [ i ] [ k ] = f [ r ] [ k − 1 ] f[i][k] = f[r][k - 1] f[i][k]=f[r][k1], 如果最后计算出 f [ i ] [ k ] ≠ 0 f[i][k] \ne 0 f[i][k]=0那么可以记录到答案中, 状态转移依赖 f [ i ] [ k − 1 ] f[i][k - 1] f[i][k1], 可以对 k k k从小到大枚举, 递推就能计算出当前状态, 算法时间复杂度 O ( n m ) O(nm) O(nm)

代码

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 270010, M = 60;int n, ans, f[N][M];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) {int val;cin >> val;f[i][val] = i + 1;}//以i为左端点合并出数字j的右端点是f[i][j]for (int k = 2; k < M; ++k) {for (int i = 1; i <= n; ++i) {if (!f[i][k]) f[i][k] = f[f[i][k - 1]][k - 1];if (f[i][k]) ans = k;}}cout << ans << "\n";return 0;
}

为什么 M = 60 M = 60 M=60

注意到 N = 262144 N = 262144 N=262144, 也就是 2 18 2 ^ {18} 218, 每个数的范围不超过 40 40 40, 最大的结果就是 40 + 18 = 58 40 + 18 = 58 40+18=58, 向上取整就是 60 60 60

http://www.xdnf.cn/news/7410.html

相关文章:

  • 05_核支持向量机
  • 机器学习 决策树-分类
  • Kotlin 协程 (二)
  • 汽车区域电子电气架构(Zonal E/E)的统一
  • CBCharacteristic:是「特征」还是「数据通道」?
  • 【Java开发--对象converter转换规范实践】
  • 特征筛选方法总结(面试准备15)
  • 3.2.1
  • MySQL 锁机制深度剖析:全局锁、表锁与行锁
  • 从零开始训练一个CLIP
  • 【成品设计】基于STM32和LoRa远程通信控制系列项目
  • Pytest自动化测试详解
  • YOLO模型predict(预测/推理)的参数设置
  • 在AI的风口里,OceanBase却选择了蹲下打地基
  • 第三十九节:视频处理-光流法 (Lucas-Kanade, Dense)
  • 【C++篇】揭秘STL vector:高效动态数组的深度解析(从使用到模拟实现)
  • ALTER COLLATION使用场景
  • RocketMQ 使用经验一二
  • 全新30m高分辨率全球地形因子数据下载方法
  • 国产RFID手持终端的自主国产化数据安全优势
  • C# 匹配模式
  • 【算法专题十四】BFS解决FloodFill算法
  • 部署springBoot项目的脚本-windows
  • C++(25): 标准库 <deque>
  • 迅联文库开发日志(三)登陆注册
  • esp32课设记录(四)摩斯密码的实现 并用mqtt上传
  • Springboot 跨域拦截器配置说明
  • JavaScript 学习
  • DW_DMAC简介
  • 嵌入式学习笔记 D22:栈与队列