安全序列 线性dp

文章讲解了如何通过动态规划计算在固定空位条件下放置油桶的不同方案,涉及递推公式和C++代码实现。
摘要由CSDN通过智能技术生成

若有两个空位,那么在上面的基础上直接不放或者隔k个0放1(因为不满足有k个0,需要特判) {0,0},{1,0},{0,1}

若有三个空位,那继续递推,直接放0,或者隔k个0放1(因为不满足有k个0,需要特判) {0,0,0} {1,0,0},{0,1,0} {0,0,1}

若有四个空位,继续按照上面的方法递推 {0,0,0,0} {1,0,0,0} {0,1,0,0} {0,0,1,0} {0,0,0,1} {1,0,0,1}

那么我们可以得到一个递推式子,dp【i】=dp【i-1】(在后面直接放0)+dp【i-k-1】(在隔k个0后放1)

如果i-k-1<1了,那么我们只需在dp【i-1】的基础上直接+1就行,因为这种情况只有一次。其余情况都是在后面直接放0.

最后我们初始化一开始的dp【1】=2即可。结果别忘了取模1e9+7

#include<bits/stdc++.h>
using namespace std;
int n,k;
const int N=1e6+9;
int mod=1e9+7;
int dp[N];      //在前i个空位有几种方案
/*
dp[i]: 表示i个空位的方案数
    第i个空位,要么放;要么不放
             放   :就从dp[i - k - 1]转移过来
             不放 :就从dp[i - 1]    转移过来
*/
int main(){
    cin>>n>>k;
    dp[0]=1;    //什么也不放也是一种
    for(int i=1;i<=n;i++){
        if(i>=k+1)  //可以放多个油桶的情况
        {
            dp[i]=(dp[i-1]+dp[i-k-1])%mod;
        }
        else    //最多放一个油桶的情况
        dp[i]=dp[i-1]+1;    
    }
    cout<<dp[n];
    

    return 0;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值