首页 > 其他分享 >【多维DP】【准NOI难度】力扣3251. 单调数组对的数目 II

【多维DP】【准NOI难度】力扣3251. 单调数组对的数目 II

时间:2024-12-21 17:31:51浏览次数:10  
标签:NOI nums int 3251 数组 II arr2 arr1 max

给你一个长度为 n 的 正 整数数组 nums 。

如果两个 非负 整数数组 (arr1, arr2) 满足以下条件,我们称它们是 单调 数组对:

两个数组的长度都是 n 。
arr1 是单调 非递减 的,换句话说 arr1[0] <= arr1[1] <= … <= arr1[n - 1] 。
arr2 是单调 非递增 的,换句话说 arr2[0] >= arr2[1] >= … >= arr2[n - 1] 。
对于所有的 0 <= i <= n - 1 都有 arr1[i] + arr2[i] == nums[i] 。
请你返回所有 单调 数组对的数目。

由于答案可能很大,请你将它对 109 + 7 取余 后返回。

示例 1:
输入:nums = [2,3,2]

输出:4

解释:

单调数组对包括:

([0, 1, 1], [2, 2, 1])
([0, 1, 2], [2, 2, 0])
([0, 2, 2], [2, 1, 0])
([1, 2, 2], [1, 1, 0])

示例 2:
输入:nums = [5,5,5,5]

输出:126

提示:
1 <= n == nums.length <= 2000
1 <= nums[i] <= 1000

动态规划

class Solution {
public:
    int countOfPairs(vector<int>& nums) {
        const int MOD = 1'000'000'007;
        int n = nums.size();
        int m = ranges::max(nums);
        vector f(n, vector<long long>(m + 1));
        vector<long long> s(m + 1);

        fill(f[0].begin(), f[0].begin() + nums[0] + 1, 1);
        for (int i = 1; i < n; i++) {
            partial_sum(f[i - 1].begin(), f[i - 1].end(), s.begin()); // f[i-1] 的前缀和
            for (int j = 0; j <= nums[i]; j++) {
                int max_k = j + min(nums[i - 1] - nums[i], 0);
                f[i][j] = max_k >= 0 ? s[max_k] % MOD : 0;
            }
        }

        return reduce(f[n - 1].begin(), f[n - 1].end(), 0LL) % MOD;
    }
};

时间复杂度:O(nm),其中 n 是 nums 的长度,m=max(nums)。
空间复杂度:O(nm)

这道题由于他要求arr1和arr2对应的arr1[i] + arr2[i] = nums[i],那么也就是说我们直到arr1的话,就可以知道arr2是多少。但是由于arr1是非递减的,而arr2是非递增的,所以arr2的范围不是单纯的nums[i]-arr1[i]。首先由于arr1是非递减的,那么也就是说arr1[i] >= arr1[i-1],然后arr2是非递增的,也就是说arr2[i] <= arr2[i-1]。我们假设arr1[i]为j,arr1[i-1]为k,arr2[i] = nums[i] - j而arr2[i-1] = nums[i-1] - k。那么我们可以列出算式nums[i-1] - k >= nums[i] - j。经过变换后得到k <= nums[i-1] - nums[i] + j。也就是说k的最大值就是nums[i-1] + nums[i] + j。而k的最大值在最小的情况下就是等于j,所以我们可以列出min(nums[i-1] - nums[i] + j, j),化简后就是int max_k = j + min(nums[i - 1] - nums[i], 0);

我们为什么要求最大k?原因是我们定义了一个二维数组f[i][j]用来表示索引0到索引i并且arr1[i]以j为结尾的单调数组对的数目。我们在递推过程中,我们遍历不同j为结尾,并且以j为结尾的单调组数目可以由f[i-1]的上一个状态并且不同结尾的数进行状态转换而来。那么我们知道了最大值k,我们就可以知道当前f[i][j]可以由f[i-1][0],f[i-1][1]…f[i-1][k]进行状态转移而来。为了避免状态转移过程中都计算f[i-1][0]+…+f[i-1][k]的值,我们可以计算上一个状态的前缀和,当我们知道最大的k的时候就可以直接使用。

由于arr1和arr2都是非负数,所以max_k必须大于0,f[i][j]才可以由上一个状态进行状态转移而来.

最后将f[i-1]的不同j为结尾的情况累加到一起就是答案。

该方法可以进行空间优化,这里不细说


还有一种O(n)的做法,是通过数学排列组合的方式,以后补充

标签:NOI,nums,int,3251,数组,II,arr2,arr1,max
From: https://blog.csdn.net/sjsjs11/article/details/144616430

相关文章

  • P7962 NOIP2021 方差
    首先观察什么样的序列是能操作得到的。考虑差分数组(由于算的是方差,所以不含第一项)可以发现,这个操作相当于交换差分数组相邻两项。也就是说,要让差分数组重排之后方差最小。考虑推方差的式子,写成\(n\suma_i^2-(\suma_i)^2\)的形式。发现最小化这个东西不太可做,于是去找结论。......
  • 环形链表 II(快慢指针)
    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果......
  • [NOI Online #3 提高组] 魔法值
    思路讲真现在脑子胡的依托转化题意,给定一个无自环无重边的\(n\)点\(m\)边的图,每天每个城市的魔法值都会变成其连边城市的魔法值的\(\oplus\),求\(a_i\)天后,\(H\)点的魔法值看到题目给的柿子和\(a_i\leq2^{32}\)感觉就要用矩快这是一种异或矩快,也就是在......
  • Luogu P8112 [Cnoi2021] 符文破译 题解 [ 蓝 ] [ KMP ] [ 线性 dp ] [ 决策单调性 dp
    符文破译:KMP+dp的好题。暴力dp不难打出一个暴力dp:设计\(dp_i\)表示当前前\(i\)位全部完成了匹配,所需的最小分割数。转移也是简单的,我们在KMP的过程中进行dp转移,每次选取next不断跳向再前面的next,然后进行转移即可。很显然一个字符集大小为\(1\)的串就能轻松......
  • 搜索二维矩阵 II
    编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例1:输入:matrix=[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]],ta......
  • NOIP2024游记
    由于这次打的挺满意所以少写点吧Day0:蹭了HZ的车去南航,然后坐地铁去南外,搞笑没出九华山站就碰见了16件NFLS校服,和回家一样了住在去年暑假集训的宾馆,但是可惜没有住在同一个房间晚上和gty,zzy,jhr一起吃饭,席上轮流给E队队爷,HZ的1队队长,whk巨佬端茶倒水,回去后在zzy房里摆了1.5......
  • 2024年OI联赛停课日记&CSP,NOIP游记
    2024.9.1日起开始上信奥。2024.9.7日起开始停课准备联赛。2024.9.21CSP-S第一轮考前考之前复习了\(7\)天初赛,我校的毒瘤出题人出的试卷考的一场比一场低,差点给我整自闭了。选择题每次都错\(5\)个以上。不过还好真正的CSP-S初赛没考炸。因为是初赛所以准备阶段就......
  • 【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
    文章目录前言一、C语言是什么?二、编译器的选择——VS2022三、main函数四、printf函数五、库函数六、关键字七、字符和ASCII编码八、字符串和'\0'九、转义字符十、注释总结前言上周考完四级(明年再战hh)和两门考试,接下来一个月将迎来其他学科的期末考试,所以这一个月......
  • 使用频谱分析仪:RBW,Res BW,分辨率带宽;Sweep,扫描;noise floor,底噪,如何降低底噪?
    RBW与Sweep的定义及其特性阐述:ResBW,即ResolutionBandwidth(分辨率带宽),是衡量仪器分辨信号细节能力的重要参数。当RBW的数值越小,意味着像素点的尺寸更为精细,从而能够观察到更为细微的信号特征。Sweep,则指的是扫描时间,它直接关联到信号的刷新速率。具体而言,Sweep时间的增长会......
  • [NOI2001] 炮兵阵地
    题目Description司令部的将军们打算在 N×MN×M 的网格地图上部署他们的炮兵部队。一个 N×MN×M 的地图由 NN 行 MM 列组成,地图的每一格可能是山地(用 HH 表示),也可能是平原(用 PP 表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部......