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;
}