设 表示 数组的第
位 最大值是
且比较次数是
的方法数
那么其中一个就是 第位,最大值在
且比较次数是
,
即转移过来的。
还有一种情况是第位的最大值也是
,那么第
位可以选择的数字肯定是
,
所以转移的方程是
所以
const mod int64 = 1000000007
func numOfArrays(n int, m int, w int) int {
if w==0{
return 0;
}
var dp [55][105][55]int64
for i:=1;i<=m;i++{
dp[1][i][1]=1;
}
for i:=2;i<=n;i++{
for j:=1;j<=m;j++{
for k:=1;k<=w;k++{
for l:=1;l<j;l++{
dp[i][j][k]+=dp[i-1][l][k-1]
dp[i][j][k]%=mod
}
dp[i][j][k]+=dp[i-1][j][k]*(int64(j))%mod
dp[i][j][k]%=mod
}
}
}
var ans int64 =0
for i:=1;i<=m;i++{
ans+=dp[n][i][w]
ans%=mod
}
return (int)(ans)
} 还有一种是用上python里的lru_cache ,这玩意居然有记忆化的功能
from functools import lru_cache
mod = 1000000007
class Solution:
def numOfArrays(self, n: int, m: int, w: int) -> int:
@lru_cache(None)
def dp(i,j,k)->int: #位置i放j时比较次数还有k的方法数
if k<0:return 0
if i+k>n or j+k>m:return 0
if i==n and k==0:return 1
ans=0
for num in range (1,m+1):
if num>j:
ans+=dp(i+1,num,k-1)
else:
ans+=dp(i+1,j,k)
ans%=mod
return ans
return dp(0,-1,w) 
京公网安备 11010502036488号