当前位置:网站首页>LeetCode 1420. 生成数组
LeetCode 1420. 生成数组
2022-06-09 15:34:00 【英雄哪里出来】

一、题目
1、题目描述
给你三个整数 n n n、 m m m 和 k k k。下图描述的算法用于找出正整数数组中最大的元素。
请你生成一个具有下述属性的数组
arr:
1、arr中有n个整数。
2、 1 ≤ a r r [ i ] ≤ m 1 \le arr[i] \le m 1≤arr[i]≤m 其中 ( 0 ≤ i < n ) (0 \le i < n) (0≤i<n)。
3、将上面提到的算法应用于arr,search_cost的值等于k。
返回上述条件下生成数组arr的 方法数 ,由于答案可能会很大,所以 必须 对 1 0 9 + 7 10^9 + 7 109+7 取余。
样例输入:n = 50, m = 100, k = 25
样例输出:34549172
2、基础框架
- C++ 版本给出的基础框架代码如下:
class Solution {
public:
int numOfArrays(int n, int m, int k) {
}
};

3、原题链接
二、解题报告
1、思路分析
( 1 ) (1) (1) 首先,我们需要知道什么情况下,search_cost会进行累加。我们来看一个图:
( 2 ) (2) (2) 设想有一个单调栈,栈中元素从 栈底 到 栈顶 都是单调递增的,那么,从左往右扫描数据,遇到红色的点就应该入栈,并且入栈的次数应该和search_cost相等。
( 3 ) (3) (3) 注意,这里需要取模,但是直接取模效率较低,可以采用减法代替取模。
1)设计状态
于是,就可以设计状态如下: d p [ i ] [ j ] [ t ] dp[i][j][t] dp[i][j][t] 表示总共有 i i i 个数,单调栈中栈顶元素为 j j j,且单调栈的总元素个数为 t t t 个。
2)最终状态
当总共有 n n n 个数,最大的数为 m m m,且search_cost为 k k k 时,我们要求的方案数就应该是 ∑ j = 1 m d p [ n ] [ j ] [ k ] \sum_{j=1}^{m} dp[n][j][k] ∑j=1mdp[n][j][k]。
3)初始状态
当只有一个数的时候,单调栈中元素的个数必定是 1 个,它就是初始状态,即: d p [ 1 ] [ j ] [ 1 ] = 1 ( 1 ≤ j ≤ m ) dp[1][j][1] = 1 (1 \le j \le m) dp[1][j][1]=1(1≤j≤m)
4)状态转移
当 d p [ i ] [ j ] [ t ] dp[i][j][t] dp[i][j][t] 已知,也就是前 i i i 个数中,单调栈中元素个数为 t t t 个,且栈顶元素的值为 j j j 的时候的方案数为 d p [ i ] [ j ] [ t ] dp[i][j][t] dp[i][j][t]。
那么,我们可以往后面继续塞入一个数,塞入的数可以是 j j ( 1 ≤ j j ≤ m ) jj(1 \le jj \le m) jj(1≤jj≤m),分两种情况讨论:
( 1 ) (1) (1) j ≥ j j j \ge jj j≥jj,那么引入 j j jj jj 并不会对单调栈产生影响,状态转移到了 d p [ i + 1 ] [ j ] [ t ] dp[i+1][j][t] dp[i+1][j][t];
( 1 ) (1) (1) j < j j j \lt jj j<jj,那么引入 j j jj jj 就会将 j j jj jj 插入到单调栈中,使得栈中元素增加了一个,状态转移到了 d p [ i + 1 ] [ j j ] [ t + 1 ] dp[i+1][jj][t+1] dp[i+1][jj][t+1];
2、时间复杂度
状态数 O ( n m k ) O(nmk) O(nmk),状态转移 O ( m ) O(m) O(m),最坏时间复杂度 O ( n m 2 k ) O(nm^2k) O(nm2k) 。
3、代码详解
class Solution {
#define maxn 52
#define maxm 102
#define maxk 52
#define mod 1000000007
int dp[maxn][maxm][maxk];
public:
int numOfArrays(int n, int m, int k) {
int i, j, t;
int jj;
memset(dp, 0, sizeof(dp));
for(j = 1; j <= m; ++j) {
dp[1][j][1] = 1;
}
for(i = 1; i <= n; ++i) {
for(j = 1; j <= m; ++j) {
for(t = 1; t <= k; ++t) {
int x = 0;
for(jj = 1; jj <= j; ++jj) {
dp[i+1][j][t] += dp[i][j][t];
if(dp[i+1][j][t] >= mod) {
dp[i+1][j][t] -= mod;
}
}
for(jj = j + 1; jj <= m; ++jj) {
dp[i+1][jj][t+1] += dp[i][j][t];
if(dp[i+1][jj][t+1] >= mod) {
dp[i+1][jj][t+1] -= mod;
}
}
}
}
}
int ans = 0;
for(j = 1; j <= m; ++j) {
ans += dp[n][j][k];
if(ans >= mod) ans -= mod;
}
return ans;
}
};
三、本题小知识
动态规划的求解过程比较单一,可以先设计状态,再考虑最终状态,边界状态,再进行状态转移。
四、加群须知
相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」。
那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:
如果链接被屏蔽,或者有权限问题,可以私聊作者解决。

大致题集一览:














为了让这件事情变得有趣,以及「 照顾初学者 」,目前题目只开放最简单的算法 「 枚举系列 」 (包括:线性枚举、双指针、前缀和、二分枚举、三分枚举),当有 一半成员刷完 「 枚举系列 」 的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为「 夜深人静写算法 」专家团 的一员。
不要小看这个专家团,三年之后,你将会是别人 望尘莫及 的存在。如果要加入,可以联系我,考虑到大家都是学生, 没有「 主要经济来源 」,在你成为神的路上,「 不会索取任何 」。
联系作者,或者扫作者主页二维码加群,加入刷题行列吧
让天下没有难学的算法 C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》 让你养成九天持续刷题的习惯 《九日集训》 入门级C语言真题汇总 🧡《C语言入门100例》🧡 组团学习,抱团生长 《算法零基础100讲》 几张动图学会一种数据结构 《画解数据结构》 竞赛选手金典图文教程 《夜深人静写算法》
边栏推荐
猜你喜欢

Garymarcus publicly shouted that Hinton and musk: deep learning is like hitting the wall. I bet 100000 dollars

Blog recommended | bookkeeper - Apache pulsar high availability / strong consistency / low latency storage implementation
![[IV. demand analysis of several Internet enterprises based on domain name]](/img/61/4c2ad2b623ab03cd5418ada49bf2e9.png)
[IV. demand analysis of several Internet enterprises based on domain name]

Blog recommended | bookkeeper - Apache pulsar high availability / strong consistency / low latency storage implementation

LM03丨谁告诉你跨品种就一定要套利?

WPS how to unhide cell worksheets

数据存储需求多样化加剧,分而治之成大势所趋

How to solve the problem that Epson printer cannot print

I learned that automated testing is so popular after I got 2w+ in a month

技术自媒体变现心得分享 —— 开始尝试认真做 CSDN 的一年后的复盘
随机推荐
From outsourcing to self research and then to large factories, who knows how I came here in the past five years
鸿蒙 PageSlider 滑动组件基础用法
Common breakthrough upload posture
【报错】No module named ‘pytest‘
Hongmeng imitation wechat chat UI effect implementation tutorial
ps怎么复制图层
Extract the new Chinese cross modal benchmark zero from 5billion pictures and texts, and Qihoo 360's new pre training framework surpasses many SOTAS
如何使用谷歌插件为网站注入代码
On June 13, the live broadcast is in hot registration! Fan Hong girls and Xinling boys, come to the live studio to learn about Huawei cloud proposition in the "Internet +" competition!
Close the privacy collection window of stackexchange and other platforms
[model] model Download & PTH model to onnx model
[II. Virtual host and domain name resolution]
实现图片灯箱功能
Various usage tutorials of Hongmeng animation animation
How to introduce Baidu statistics into the nuxt project?
数据产品学习-实时计算平台
非scroll-view的纵向滑动
[v. reverse proxy and related configurations]
LM03丨谁告诉你跨品种就一定要套利?
六月集训(第09天) —— 二分查找
请你生成一个具有下述属性的数组 