P8725 [蓝桥杯 2020 省 AB3] 画中漂流
题目描述
在梦境中,你踏上了一只木䇝,在江上漂流。
根据对当地的了解,你知道在你下游 DDD 米处有一个峡谷,如果你向下游前进大于等于 DDD 米则必死无疑。
现在你打响了急救电话,TTT 秒后救援队会到达并将你救上岸。水流速度是 1 m/s1 \mathrm{~m} / \mathrm{s}1 m/s,你现在有 MMM 点体力。每消耗一点体力,你可以划一秒桨使船向上游前 进 1 m1 \mathrm{~m}1 m,否则会向下游前进 1 m1 \mathrm{~m}1 m (水流)。MMM 点体力需在救援队赶来前花光。因为江面太宽了,凭借你自己的力量不可能上岸。
请问,有多少种划桨的方案可以让你得救。
两个划桨方案不同是指:存在某一秒钟,一个方案划桨,另一个方案不划。
输入格式
输入一行包含三个整数 DDD,TTT,MMM。
输出格式
输出一个整数,表示可以让你得救的总方案数,答案可能很大,请输出方案数除以 100000000710000000071000000007(即 109+710^9+7109+7)的余数。
输入输出样例 #1
输入 #1
1 6 3
输出 #1
5
说明/提示
对于 50%50 \%50% 的评测用例,1≤T≤3501 \leq T \leq 3501≤T≤350。
对于所有评测用例,1≤T≤3000,1≤D≤T,1≤M≤15001 \leq T \leq 3000,1 \leq D \leq T,1 \leq M \leq 15001≤T≤3000,1≤D≤T,1≤M≤1500。
蓝桥杯 2020 第三轮省赛 AB 组 I 题。
C++实现
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int f[3030][3030];
int d, t, m;
int main(){
cin >> d >> t >> m;
f[0][m] = 1;
for (int i = 1; i <= t; ++i) {
for (int j = 0; j <= m; ++j) {
int len = d + (m - j) - (i - (m - j));
if (len > 0) {
f[i][j] = (f[i - 1][j] + f[i - 1][j + 1]) % mod;
}
}
}
cout << f[t][0] << endl;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容