链接:https://www.nowcoder.com/acm/contest/140/A
动态规划
dp[i][0/1] 后面 0或1表示最后一步走的还是跑的
dp[i][0] = dp[i-1][0] + dp[i-1][1] 走过来的就是前一步走的,加前一步跑的总方案数
dp[i][1] = dp[i-k][0] 跑过来的就是 前k步状态时走过来的方案 (前K步走的时候 然后再跑一步跑到当前状态)
分析:先算出所有的情况下(从1到maxn) 的类型(动态规划-----每加一个距离,就加上该距离前一个是跑的方案和走的方案
),再按题目去减
为什么不先输出L,R再算?-------按案例分析 如果你算dp[5][1]时,你是要用到dp[2][0]的,所以每种都要算出来。
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 100005;
const int mod = 1000000007;
int q, k;
ll dp[maxn][2];
ll sum[maxn];
int main()
{
// freopen("C:\\Users\\syy\\Desktop\\测试数据.txt","r",stdin);
cin >> q >> k;
dp[0][0] = 1;
for(int i = 1;i < maxn;i ++)
{
dp[i][0] = (dp[i-1][0] + dp[i-1][1]);
if(i >= k)
{
dp[i][1] = dp[i-k][0]% mod;
}
sum[i] = sum[i-1] + dp[i][0] + dp[i][1];
int l, r;
while(q --)
{
cin >> l >> r;
cout<<(sum[r]-sum[l-1])%mod<<endl;
}
return 0;
}