2018.7.21牛客多校第二场 A题

链接: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;
	}

猜你喜欢

转载自blog.csdn.net/qq_40725780/article/details/81168424