您的位置:首页 > 其它

牛客网暑期ACM多校训练营(第二场) A - run - 动态规划

2018-08-28 09:49 543 查看

run

 

 

题解:

简单的动态规划。

题目提到 White Cloud 有两种移动方式① walk 1 meters per second,② run k meters per second。

也就是说从次末状态到末状态有两种方式即 “walk 1 meters” 和 “run k meters” 。

也就是说,我们只需要把倒退 1 meter 和 k meters 的两种状态求出来就求出末状态。

从上面我们可以想到 “dp[i] = dp[i-1] + dp[i-k];” ,但是要注意,题目还有一个条件 Since White Cloud is tired,it can't run for two or more continuous seconds ,即White Cloud 不能连续奔跑。所以,我们要写成 “dp[i] = dp[i-1] + dp[i-k-1];” 。

还有要注意的是,因为 Init 函数里 %mod 可能导致 dp[r] < dp[l-1] ,所以 dp[r] + mod 以确保 > dp[l-1]。

代码:

[code]#include <cstdio>
using namespace std;
const int MAXN = 1e5+10;
const int mod = 1e9+7;
int k, q, l, r;
int dp[MAXN];

void Init(){
for(int i = 0; i < k; i++)
dp[i] = 1;
dp[k] = 2;
for(int i = k+1; i <= 100000; i++)
dp[i] = (dp[i-1] + dp[i-k-1]) % mod;
for(int i = 1; i <= 100000; i++)
dp[i] = (dp[i] + dp[i-1]) % mod;
return ;
}

int main(){
scanf("%d %d", &q, &k);
Init();
while(q--){
scanf("%d %d", &l, &r);
printf("%d\n", (dp[r] - dp[l-1] + mod)%mod);
}
return 0;
}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐