蓝桥杯题目-建造房屋

本文介绍了如何利用动态规划解决一个关于建造房屋的问题,给定街道数量和每个街道可建房屋的最大数量,计算在前n条街道上总共建造k个房屋的方案数。给出了详细的C++代码实现和转移方程描述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接

建造房屋 - 蓝桥云课 (lanqiao.cn)

知识点

动态规划

思路

       dp[i][j] 表示前 i 条街道,总共建造 j 个房屋的方案数,先枚举每条街道,在枚举当前街道,能建造的房屋数,再枚举前 i-1 条街道,能建造的房屋数,当前街道建j个房屋,前i-1条街道总共建s个房屋,故前i条街道共建j+s个房屋,用dp[i][j+s]表示方案数,dp[i][j+s] 累加上 在前i-1个街道上建s个房屋的方案数,即 dp[i-1][s] 。

        动态转移方程为 dp[i][j+s] = (dp[i][j+s] + dp[i-1][s]) % mod

代码

#include<bits/stdc++.h>
using namespace std;

using ll = long long; 
const ll mod = 1e9 + 7;

ll dp[55][2605];  //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++)//依次考虑前1~n条街道 
    { 
      for(int j = 1; j <= m ; j++)//考虑依次在当前街道(第i条街道)建造1~m个房屋
      { 
        for(int s = i-1; s <= k-1; s++)
        //对于前i-1条街道,首先每条街道至少建一个房屋,总共至少建i-1个房屋,至多建k-1个房屋 
        //故从i-1遍历到k-1,即为前i-1条街道所有可能的房屋总数 
        { 
        //当前街道建j个房屋,前i-1条街道总共建s个房屋,故前i条街道共建j+s个房屋,用dp[i][j+s]表示方案数
        //dp[i][j+s] 累加上 在前i-1个街道上建s个房屋的方案数,即dp[i-1][s] 
         dp[i][j+s] = (dp[i][j+s] + dp[i-1][s]) % mod;
        } 
      } 
    } 
    cout << dp[n][k] << endl; //dp[n][k]即在前n条街道,总共建造k个房屋的方案数 
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值