- https://ac.nowcoder.com/acm/contest/140/A
- 题意:一个人,一秒可以走1米可以跑k米,但由于体力问题不能连续跑求一个在[L,R]区间内停止的方案数。
- 思路:简单DP,dp[i][0]为走,可以有 dp[i-1][0],dp[i-1][1]转移而来,但是 dp[i][1]为跑,只有距离够了且只能由
- dp[i-k][0]转移而来,预处理 前缀和 O[1]查询即可。
-
#include<bits/stdc++.h> using namespace std; #define maxn 100000+10 #define mod 1000000007 #define ll long long ll dp[maxn][3],sum[maxn]; int q,k,l,r; int main() { scanf("%d%d",&q,&k); dp[0][0]=1; for(int i=1; i<maxn; i++) { dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) % mod; if(i>=k) dp[i][1] = (dp[i - k][0]) % mod; } for(int i=1; i<maxn; i++) sum[i]=(sum[i-1]+(dp[i][0]+dp[i][1])%mod)%mod; while(q--) { scanf("%d%d",&l,&r); printf("%lld\n",(sum[r]-sum[l-1]+mod)%mod); } return 0; }
A-run -递推型-DP
最新推荐文章于 2020-07-31 23:07:26 发布