栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode 1866. 恰有 K 根木棍可以看到的排列数目**

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 1866. 恰有 K 根木棍可以看到的排列数目**

具体思想:

感觉这道题只能背;

之前自己考虑的事把最高的插入k-1~n的位置,转化为子问题;

但是看到这样的思路会超时;

可以根据递推方程优化,但是自己当场肯定优化不出来;

简单的思路是,只看最后一个位置;

如果最后一个位置能看到,说明最高的在最后一个位置,只需要找dp[n-1][k-1];

如果最后一个位置看不到,则说明有一个矮子在最后一个位置上,但是前半部分依然有序;

可以在最后一位放n-1个矮子,因此有(n-1)*dp[n-1][k];

这里要注意一下,为什么不考虑倒数第二位,是因为在dp[n-1][…]中,也会考虑到,不用重新考虑;

具体代码:
using ll=long long;
class Solution {
public:
    int rearrangeSticks(int N, int K) {
        vector>dp(N+1,vector(K+1,0));
        ll mod=1000000007;
        dp[0][0]=1;
        for(int n=1;n<=N;n++){
            for(int k=1;k<=K;k++){
                dp[n][k]=dp[n-1][k-1]%mod+((n-1)*dp[n-1][k])%mod;
                dp[n][k]%=mod;
            }
        }
        return dp[N][K];
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/893003.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号