3362 建造房屋

dp[i][j]的含义:前i个街道建设j个房屋的方案

dp[0][i]数组的初始化


对于 dp[0][i],表示在考虑前 0 条街道的情况下,总共建造 i 个房屋的方案数为 1。

这个初始化操作是为了让动态规划的递推过程能够顺利开始。

因为在考虑前 0 条街道时,无论要建造多少个房屋,方案数都是 1,这样可以作为递推的起点。 这样的初始化操作确保了动态规划的递推过程能够从初始状态开始顺利进行,最终得到正确的结果。

#include <bits/stdc++.h>
using ll=long long;
const ll p=1e9+7;
using namespace std;
ll dp[55][2605];//dp[N][N*M]
//设dp[i][j]表示只考虑前i个街道(并非最后一个)总共建造j个房屋的方案数
int main()
{
  int N,M,K;cin>>N>>M>>K;
  for(int i=0;i<=K;i++)dp[0][i]=1;
  for(int i=1;i<=N;i++)//依次考虑前n条街道
  {
    for(int j=1;j<=M;j++)//考虑在当前街道(第i条街道建造1-M个房屋)
    {//建1个房屋或者是建造M个房屋
      for(int k=i-1;k<=K-1;k++)
      {//对于前面i-1个街道,首先每个街道至少建造一个房屋,总共至少建造i-
      //从i-1到K-1是前i-1条街道所有可能的房屋总数
      //当前街道建造j个房屋,前i-1条街道总共建设k个房屋,所以前i条街道总共建设了j+k个房屋 
        dp[i][j+k]=(dp[i][j+k]+dp[i-1][k])%p;
      }
    }
  }
  cout<<dp[N][K]<<endl;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值