2 条题解
-
0
对于动态规划的题目,老规矩,分四步解:
第一步,把示意图画出来,将问题可视化:

第二步:找到合适的子问题:
如图,从第8步开始,每一步等于n-1或来自于n-2,那么子问题就是第到达第i个点有多少条路线。
第三步:找到子问题直接的关系:
第i点的路线数量等于点i-a和点i-b的数量的累加。
第四步:按顺序解决子问题,在这道题目里,按顺序是逆序,而不是顺序。
#include <iostream> #include<iomanip> using namespace std; int arr[200001]; int n, a, b, c; //从n减到c,每次减a或减b long long ans = 0; int main(){ cin >> n >> a >> b >> c; arr[n] = 1; for (int i =n; i > c; i--) { if (i - a > c) { arr[i - a] += arr[i]; arr[i - a] %= 1000000007; }else ans += arr[i]; if (i - b > c) { arr[i - b] += arr[i]; arr[i - b] %= 1000000007; }else ans += arr[i]; ans %= 1000000007; } cout << ans; return 0; } -
0
- 1
信息
- ID
- 1860
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者