前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >杨校老师课堂之基于C++的动态规划进行解题_信息学奥数赛-基础练习题

杨校老师课堂之基于C++的动态规划进行解题_信息学奥数赛-基础练习题

作者头像
杨校
发布2025-02-23 07:55:24
发布2025-02-23 07:55:24
5300
代码可运行
举报
运行总次数:0
代码可运行

动态规划(Dynamic Programming,简称 DP)是一种用于解决优化问题的算法设计技术,核心思想是把一个复杂的、规模较大的问题分解成一系列相互关联的子问题,并保存子问题的解以避免重复计算,通过组合这些子问题的解来得到原问题的最优解。

1. 母球的故事 — — ( 计蒜客 - T1780 )

题目表述: 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第 n 年的时候,共有多少头母牛?

输入格式 输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数 n(0<n<55),n的含义如题目中描述。 n=0表示输入数据的结束,不做处理。

输出格式 对于每个测试实例,输出在第 n年的时候母牛的数量。 每个输出占一行。

输入样例

2 4 5 0

输出样例

2 4 6

参考编码

代码语言:javascript
代码运行次数:0
复制
#include <iostream>
using namespace std;

int main() {
    // 定义变量n,用于接收输入的年份数
    int n;
    // 使用while循环,持续读取输入的n,只要输入不为0就继续循环
    while (cin >> n && n!= 0) {
        // 定义动态规划数组dp,用于存储每年的母牛数量,数组大小设为55,可根据需要调整
        int dp[55] = {0};
        // 设定边界条件:第1年年初,母牛的数量是1,所以dp[1]为1
        dp[1] = 1;
        // 设定边界条件:第2年年初,原来的1头母牛生了1头小牛,母牛总数变为2,所以dp[2]为2
        dp[2] = 2;
        // 设定边界条件:第3年年初,原来的母牛和第1年出生的小牛各生了1头小牛,母牛总数变为3,所以dp[3]为3
        dp[3] = 3;
        // 从第4年开始,利用状态转移方程计算每年的母牛数量
        for (int i = 4; i <= n; i++) {
            // 状态转移方程:第i年的母牛数量等于第i - 1年的母牛数量(上年存活的母牛)
            // 加上第i - 3年的母牛数量(因为3年前出生的小牛到今年开始可以生小牛了)
            dp[i] = dp[i - 1] + dp[i - 3];
        }
        // 输出第n年的母牛数量
        cout << dp[n] << endl;
    }
    return 0;
}

动态规划(Dynamic Programming,简称 DP)是一种用于解决优化问题的算法设计技术,核心思想是把一个复杂的、规模较大的问题分解成一系列相互关联的子问题,并保存子问题的解以避免重复计算,通过组合这些子问题的解来得到原问题的最优解。


2. 铺砖 — — ( 计蒜客 - T1209)

题目表述: 对于一个 2 行 N 列的走道。现在用 1×2,2×2 的砖去铺满。问有多少种不同的方式。 下图是一个 2 行 17 列的走道的某种铺法。

输入格式 一个数字 N,0≤n≤250。

输出格式 方案数。(对 100007取模)。

输入样例

2 3 4 8

输出样例

3 5 11 171

参考编码

代码语言:javascript
代码运行次数:0
复制
#include <iostream>
using namespace std;

// 定义一个常量MOD,用于取模运算,防止结果数值过大
int MOD = 100007;  

int main() {
    int n;
    // 从标准输入读取需要铺满的走道长度n(以2×n的形式理解)
    cin >> n;  
    // 定义动态规划数组dp,用于存储铺满2×i走道的不同方式数
    int dp[n + 1];  
    // 初始化边界条件:dp[0]表示铺满2×0的走道的方式数,有一种方式,即什么都不铺
    dp[0] = 1;  
    // 初始化边界条件:dp[1]表示铺满2×1的走道的方式数,有一种方式,即竖着放一块1×2的砖
    dp[1] = 1;  

    // 动态规划递推过程,从i = 2开始,逐步计算到i = n
    for (int i = 2; i <= n; i++) {  
        // 根据状态转移方程计算dp[i]:
        // dp[i]取决于两种情况:
        // 1. 最后一块砖竖着放(对应dp[i - 1]种铺法)
        // 2. 最后放一个2×2的单元(有两种等效方式,对应2 * dp[i - 2]种铺法)
        // 为防止数值过大,每次计算结果都对MOD取模
        dp[i] = (dp[i - 1] + 2 * dp[i - 2]) % MOD;  
    }
    // 输出铺满2×n走道的不同方式数
    cout << dp[n] << endl;  
    return 0;
}```

---
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 母球的故事 — — ( 计蒜客 - T1780 )
  • 2. 铺砖 — — ( 计蒜客 - T1209)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档