2020牛客寒假算法基础集训营5
作者:互联网
E碎碎念
思路:
题目中有一句话很重要:
所以一旦这一发是错的,那么下一发一定是对的。即上一发错,这一发对。
dp[i][0]的含义是:对于第i这一句是不行的
dp[i][1]的含义是:对于第i这一句是行的
两个转移方程: dp[i][0] = dp[i-x][1],由于你能不能行呀这句话是连着说x句的,所以这一句是不行的话,那么i-x+1~i都是不行的,所以转移到的是i-x这一句是行的
dp[i][1] = dp[i-1][0]+dp[i-1][1],对于这一句是行的,那么就没什么要求,上一句无论是什么都行
代码:
#include<iostream> #include<stdio.h> using namespace std; typedef long long ll; const int maxn= 1e5+10; const int mod = 1e9+7; ll dp[maxn][2],sum[maxn]; int main(){ int x; cin>>x; int q; cin>>q; dp[0][1] =1;//初始化 for(int i=1;i<=maxn;i++){ if(i>=x) dp[i][0] = dp[i-x][1]; dp[i][1] = (dp[i-1][0]+dp[i-1][1])%mod; } for(int i=1;i<=maxn;i++){ sum[i]=(sum[i-1]+dp[i][0]+dp[i][1])%mod; } while(q--){ int l,r; scanf("%d%d",&l,&r); cout<<(sum[r]-sum[l-1]+mod)%mod<<endl;//这个一定不能少,少了就只有33%的通过率 } return 0; }
标签:一句,int,牛客,一发,2020,maxn,集训营,dp,mod 来源: https://www.cnblogs.com/lusiqi/p/12330827.html