洛谷Oj-台阶问题————DP

本文探讨了一个经典的递归问题——台阶问题。目标是计算达到第N级台阶的不同方式数量,每次可迈最多K级。通过动态规划的方法实现了高效的解答,并提供了一个C++实现的示例代码。

1479: 台阶问题
时间限制: 1 Sec 内存限制: 128 MB

提交: 262 解决: 77 统计
题目描述
有 N 级的台阶,你一开始在底部,每次可以向上迈最多 K 级台阶(最少 1 级),问到达第 N 级台阶有多少种不同方式。
输入
多组输入,两个正整数N(N ≤ 1000),K(K ≤ 100)。
输出
一个正整数,为不同方式数,由于答案可能很大,你需要输出 ans mod 100003 后的结果。
样例输入
5 2
样例输出
8
来源
丁金峰


推这个规律写了好几张纸

dp[n]={2n1 % modki=1dp[ni]%modnkn>kdp[n]={2n−1 % modn≤k∑i=1kdp[n−i]%modn>k

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
const int c=100003;
int a[MAXN];
int main()
{
    int n,k;
    while(~scanf("%d %d",&n,&k))
    {
        if(k==1)    
        {
            printf("1\n");
            continue;
        }
        memset(a,0,sizeof(a));
        a[1]=1;a[2]=2;
        for(int i=3;i<=k;i++)
            a[i]=(a[i-1]%c+(2*a[i-2])%c)%c;
        for(int i=k+1;i<=n;i++)
            for(int j=1;j<=k;j++)
                a[i]=(a[i]%c+a[i-j]%c)%c;

        printf("%d\n",a[n]%c);
    }
    return 0;
}
## ✅ 题目:7-104 sdut-C语言实验——求两个整数之中较大者 这是山东理工大学(SDUT)OJ 系统中的一道基础 C 语言编程题,考察 **输入输出、条件判断和最大值比较**。 --- ### 📌 题目描述(根据 SDUT 常见题型还原) > 输入两个整数,输出其中较大的那个数。 ### 🔍 输入格式: 一行,包含两个整数 `a` 和 `b`,用空格分隔。 ### 🔍 输出格式: 一个整数,表示 `a` 和 `b` 中的较大值。 ### 📌 示例 1: ``` 输入:5 10 输出:10 ``` ### 📌 示例 2: ``` 输入:-3 7 输出:7 ``` ### 📌 示例 3: ``` 输入:8 8 输出:8 ``` > ⚠️ 注意:如果两数相等,输出任意一个即可(即输出该值)。 --- ## ✅ 正确解答代码(C语言) ```c #include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); if (a >= b) { printf("%d\n", a); } else { printf("%d\n", b); } return 0; } ``` --- ## 🔍 代码解释 | 代码片段 | 功能说明 | |--------|---------| | `int a, b;` | 定义两个整型变量存储输入 | | `scanf("%d %d", &a, &b);` | 从标准输入读取两个整数 | | `if (a >= b)` | 判断 a 是否大于等于 b<br>使用 `>=` 可以在相等时优先输出 a | | `printf("%d\n", a);` | 输出较大值,并换行(重要!) | | `else` 分支 | 当 b 更大时输出 b | > ✅ 使用 `>=` 而不是 `>` 是为了处理相等的情况,确保有输出。 --- ## ✅ 其他写法(等价实现) ### 方法一:使用三目运算符(简洁写法) ```c #include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); printf("%d\n", a >= b ? a : b); return 0; } ``` ### 方法二:使用标准库函数(需引入 `fmax`,但对整数不推荐) > 不适用于本题,因为 `fmax` 是浮点函数,且 SDUT OJ 通常要求基础写法。 --- ## ❗ 常见错误与注意事项 | 错误 | 后果 | |------|------| | 忘记 `&` 符号:`scanf("%d %d", a, b);` | 运行时错误(段错误) | | 使用 `cin/cout` | 编译错误(题目要求 C 语言) | | 输出没有 `\n` 换行 | 格式错误(Presentation Error, PE) | | 写成 `if (a > b)` 而不是 `>=` | 当 a == b 时可能漏输出(取决于逻辑) | | 多余提示语句:如 `"请输入两个数:"` | 输出超范围,判为 WA | > ✅ SDUT 的 OJ 系统要求严格匹配输出格式,**不要添加任何额外文字!** --- ## ✅ 测试样例验证 | 输入 | 输出 | 是否通过 | |------|------|----------| | `5 10` | `10` | ✅ | | `-3 7` | `7` | ✅ | | `8 8` | `8` | ✅ | | `100 -50` | `100` | ✅ | --- ## ✅ 总结 这是一道典型的“入门级”程序设计题,目的是训练: - 基本输入输出(`scanf`, `printf`) - 条件控制结构(`if-else`) - 整数比较逻辑 - OJ 提交规范意识(无多余输出) 虽然简单,但它是后续学习分支、循环、函数的基础。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值