5391. 生成数组



图片说明


表示 数组的第 位 最大值是且比较次数是 的方法数
那么其中一个就是 第位,最大值在且比较次数是
转移过来的。
还有一种情况是第位的最大值也是,那么第位可以选择的数字肯定是 ,
所以转移的方程是
所以

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)