小明是个智商为 0 的白痴他希望通过吃药的方式将自己的智商提升至 n。市面上一共有 m 种智商药编号 1∼m。第 i 种药的疗效区间为 liri其中 liri。具体来说一个人可以服用第 i 种药当且仅当其智商在 liri−1 范围内服下该药后其智商会变为 ri。请你计算小明一共有多少种吃药的方法可以让他的智商提高至 n。由于结果可能很大所以你只需要输出对 109+7 取模后的结果。如果两种吃药方法
这是一个动态规划的问题。
我们可以定义一个二维数组 dp,其中 dp[i] 表示小明的智商为 i 时,有多少种吃药的方法。
对于 dp[i],我们可以通过遍历所有的药物,来计算出小明在智商为 i 时的吃药方法数。
具体来说,对于每一种药物 j,如果其疗效区间满足 li <= i < ri,那么小明可以选择吃下这种药物,将智商提升至 ri。此时,小明的智商为 i+1,我们可以通过 dp[i+1] += dp[i] 来更新小明智商为 i+1 时的吃药方法数。
最终,我们只需要返回 dp[n] 即可。
下面是具体的实现代码:
const int MOD = 1e9 + 7; const int MAXN = 1000;
int dp[MAXN];
int solve(int n, vector<pair<int, int>>& medicines) { memset(dp, 0, sizeof(dp)); dp[0] = 1;
for (int i = 0; i < n; i++) {
for (auto& med : medicines) {
int l = med.first;
int r = med.second;
if (l <= i && i < r) {
dp[i+1] = (dp[i+1] + dp[i]) % MOD;
}
}
}
return dp[n];
原文地址: https://www.cveoy.top/t/topic/hFm8 著作权归作者所有。请勿转载和采集!