描述
给你三个整数 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
}