Leetcode-1420 生成数组

描述

给你三个整数 n、m 和 k 。下图描述的算法用于找出正整数数组中最大的元素。

func maxIn(arr []int) (int, int) {
    max_v := 0
    max_i := 0
    sc:=0
    for i:=0;i<len(arr);i++{
        if max_v < arr[i] {
            max_v = arr[i]
            max_i = i
            sc++
        }
    }
    return max_v, max_i
}

请你生成一个具有下述属性的数组 arr :

arr 中有 n 个整数。
1 <= arr[i] <= m 其中 (0 <= i < n) 。
将上面提到的算法应用于 arr ,search_cost 的值等于 k 。
返回上述条件下生成数组 arr 的 方法数 ,由于答案可能会很大,所以 必须 对 10^9 + 7 取余。

 

示例1

输入:n = 2, m = 3, k = 1
输出:6
解释:可能的数组分别为 [1, 1], [2, 1], [2, 2], [3, 1], [3, 2] [3, 3]

示例 2

输入:n = 5, m = 2, k = 3
输出:0
解释:没有数组可以满足上述条件

示例 3

输入:n = 9, m = 1, k = 1
输出:1
解释:可能的数组只有 [1, 1, 1, 1, 1, 1, 1, 1, 1]

示例 4

输入:n = 50, m = 100, k = 25
输出:34549172
解释:不要忘了对 1000000007 取余

示例 5

输入:n = 37, m = 17, k = 7
输出:418930126

提示

1 <= n <= 50
1 <= m <= 100
0 <= k <= n


来源:力扣(LeetCode)
链接:https:leetcode-cn.com/problems/build-array-where-you-can-find-the-maximum-exactly-k-comparisons
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

// 关键元素的位置问题
// 按关键元素所在位置分类
// 状态变量:n,m,k

const mod =1e9+7


func numOfArrays(n int, m int, k int) int {
	// f[n][i][k]:n个元素,元素最大值i,search_cost为k的切片数量
	f := make([][][]int, n+1)
	for i:=0;i<n+1;i++{
		f[i] = make([][]int, m+1)
		for j:=0;j<m+1;j++{
			f[i][j] = make([]int, k+1)
		}
	}
	for n1:=1;n1<=n;n1++{
		for k1:=1;k1<=k;k1++{
			for i:=1;i<=m;i++{
				f[n1][i][k1] = i* f[n1-1][i][k1]
				for j:= 1; j<i;j++{
					f[n1][i][k1] += f[n1-1][j][k1-1]
				}
				if n1 == 1 && k1 == 1 {
					f[n1][i][k1] = 1
				}
				f[n1][i][k1] %= mod
			}
		}
	}
	res := 0
	for i:=1;i<=m;i++{
		res += f[n][i][k]
		res %= mod
	}
	return res
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值