LeetCode 5391. 生成数组

https://leetcode-cn.com/problems/build-array-where-you-can-find-the-maximum-exactly-k-comparisons/

这道题我先从枚举dfs,需要使用到已经枚举的个数,之前的最大数、以及花费。

然后稍微改下,所以状态定义是dp[i][max_num][cost],表示已经枚举的个数,已经枚举的最大数、以及花费 的数量。

然后设置dp[0][1][num]=1,

状态转移是从上一个枚举位置转移过来,记数dp,记录每个状态有多少个个数,那么一个状态的个数由能转移到这个状态的个数相加之和。

 

class Solution {
public:
    int numOfArrays(int n, int m, int k) {
        int mod=1000000007;
        long long dp[50+5][100+5][100+5];
        memset(dp,0,sizeof(dp));
        
        for(int i=1;i<=m;i++)
            dp[0][1][i]=1;
        
        for(int i=1;i<n;i++){
            for(int count=1;count<=k;count++){
                for(int num2=1;num2<=m;num2++){
                        for(int num1=1;num1<=m;num1++){
                            if(num2<=num1){
                                dp[i][count][num1]+=dp[i-1][count][num1];
                                dp[i][count][num1]%=mod;
                            }
                            else if(num2>num1){
                                dp[i][count+1][num2]+=dp[i-1][count][num1];
                                dp[i][count+1][num2]%=mod;
                            }
                        }
                    
                }
            }
        }
        
        long long ans=0;
        for(int i=1;i<=m;i++){
            ans+=dp[n-1][k][i];
            ans%=mod;
        }
        return ans;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值