首页 > 其他分享 >ABC262G 题解

ABC262G 题解

时间:2024-09-27 09:22:59浏览次数:1  
标签:std le int 题解 long vector ABC262G dp

LIS with Stack

观察到 \(n \le 50\),考虑区间 dp。设 \(dp(l, r, x, y)\) 表示区间 \([l, r]\) 中选出的子序列的最小值 \(\ge x\),最大值 \(\le y\) 的方案数。

根据栈的性质,设元素 \(x\) 入栈的时间为 \(in_x\),出栈时间为 \(out_x\),那么所有元素构成的区间 \([in_x, out_x]\) 两两之间要么包含要么不交。根据此性质可以设计出 dp 状态的转移。

对于状态 \(dp(l, r, x, y)\),枚举 \(a_l\) 是什么时候出栈的,假设把它弹出去的元素是 \(a_k\) 满足 \(x \le a_k \le y \land a_l < a_k\),那么有:

\[dp(l, r, x, y) = \max_{k = l + 1}^r dp(l + 1, k - 1, x, a_l) + dp(k, r, a_l, y) + 1 \]

可以删掉 \(a_l\),有 \(dp(l, r, x, y) = \max\{dp(l, r, x, y), dp(l + 1, r, x, y)\}\)。

也可以刚把 \(a_l\) 入栈就直接出栈,即 \(dp(l, r, x, y) = \max\{dp(l, r, x, y), dp(l + 1, r, x, a_l) + 1\}\)。

总时间复杂度 \(O(n^5)\),因为区间 dp 有各种 \(\dfrac{1}{2}\) 常数所以跑得很快。

代码:

#include <bits/stdc++.h>

using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    std::cin >> N;

    std::vector<int> A(N + 1);
    for (int i = 1; i <= N; ++i) {
        std::cin >> A[i];
    }

    constexpr int V = 50;
    std::vector dp(N + 1, std::vector(N + 1, std::vector(V + 1, std::vector<int>(V + 1, 0))));

    auto Pre_Work = [&](auto &dp) {
        for (int len = 2; len <= V; ++len) {
            for (int x = 1, y = len; y <= V; ++x, ++y) {
                dp[x][y] = std::max({dp[x][y], dp[x + 1][y], dp[x][y - 1]});
            }
        }
    } ;

    for (int i = 1; i <= N; ++i) {
        dp[i][i][A[i]][A[i]] = 1;
        Pre_Work(dp[i][i]);
    }

    for (int len = 2; len <= N; ++len) {
        for (int l = 1, r = len; r <= N; ++l, ++r) {
            for (int x = 1; x <= V; ++x) {
                for (int y = x; y <= V; ++y) {
                    dp[l][r][x][y] = dp[l + 1][r][x][y];
                    if (A[l] < x || A[l] > y) {
                        continue;
                    }
                    dp[l][r][x][y] = std::max(dp[l][r][x][y], dp[l + 1][r][x][A[l]] + 1);
                    for (int k = l + 1; k <= r; ++k) {
                        if (std::max(x, A[l] + 1) <= A[k] && A[k] <= y) {
                            int res = dp[l + 1][k - 1][x][A[l]] + 1;
                            res += dp[k][r][A[l]][y];
                            dp[l][r][x][y] = std::max(dp[l][r][x][y], res);
                        }
                    }
                }
            }
            Pre_Work(dp[l][r]);
        }
    }

    std::cout << dp[1][N][1][V] << "\n";

    return 0;
}

标签:std,le,int,题解,long,vector,ABC262G,dp
From: https://www.cnblogs.com/CTHOOH/p/18435004

相关文章

  • 2024-2025专题二题单 - 题解
    A-MoneyinHand(记忆化搜索)原题链接题解B-GoodGraph(并查集)原题链接题解C-IceSkating(dfs求连通块)原题链接题解D-TheLakes(dfs求连通块,连通块内累加,多组数据注意初始化)原题链接题解E-LearningLanguages(建图,dfs统计连通块个数,答案为个数-1)原题链接题......
  • 进击的奶牛题解
    题目描述FarmerJohn建造了一个有 N(2≤N≤105)个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x1,x2,⋯ ,xN​(0≤xi≤109)。他的 C(2≤C≤N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,FarmerJohn想把这些牛安置在指定的隔间,所......
  • 奶牛分厩题解
    题目描述农夫约翰有 N(1≤N≤5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号 s[i],所有的奶牛都睡在一个有 K 个厩的谷仓中,厩的编号为 00 到 K−1。每头奶牛都知道自己该睡在哪一个厩中,因为约翰教会了它们做除法,Si mod K的值就是第 i 头奶年所睡的厩的编......
  • 易优cms安全设置常见问题_Eyoucms安全设置问题解决方法
    易优EyouCMS的安全设置对于保护网站免受攻击非常重要。下面列出了一些关于易优CMS安全设置的常见问题及其解决方法:1.目录权限设置为了防止未经授权的访问,应该合理设置网站目录的权限。例如,上传目录通常需要写入权限,而其他目录则应限制权限以防止恶意文件上传或执行。解决方法......
  • 勇攀山丘小队(翻越篇)2——题解
    前言胸有丘壑,气吞山河。正片A题思路其实很简单,当你以当前位置在\(i\),油量为\(p\)的地方开到了位置为\(j\),且\(p_{j+1}-i>p\)时,你肯定走不了了。因此你应当在\(i\)到\(j\)找到能加油最多的加油站来进行加油。需要动态维护这个最大值的数据结构我们可以利用堆来实......
  • 题解 QOJ837 / ZROI1287【Giant Penguin】
    PetrozavodskWinter2020.Day3.300iqContest3.ProblemG.GiantPenguinGiantPenguin-Problem-QOJ.ac题目描述有一个\(n\)个点\(m\)条边的连通无向无权图,满足每个节点在至多\(k\)个简单环上(没有重复顶点的环是简单环)。\(q\)次操作支持:1.标记一个点;2.询问......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【哈希表】2024E-选修
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【DFS/BFS】2024E-开
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出解题思路代码解法一:BFSpythonjavacpp......
  • LGP1313 题解
    原题链接:P1313[NOIP2011提高组]计算系数。难度:Easy。考察二项式定理的基本应用。正解发现存在式子\((ax+by)^k\),容易想到二项式定理。二项式定理:\[(x+y)^n=\sum\limits_{i=0}^{n}{n\choosei}x^iy^{n-i}\]令\(p=ax,q=by\),那么原式变为\((p+q)^k\)。那么此时......
  • LGB3717 题解
    原题链接:B3717组合数问题。难度:Easy组合数学的模板题。排除做法:\(n,m\le5\times10^6\),显然不能使用杨辉三角递推。模数为\(998,244,353\),无法使用\(\text{Lucas}\)定理。正解考虑直接使用组合数的计算式:\[{n\choosem}=\dfrac{n!}{m!(n-m)!}\]其中\(n!\)可......