我是靠谱客的博主 快乐小霸王,最近开发中收集的这篇文章主要介绍【Codeforces Round 271 (Div 2)D】【DP】Flowers 黑色必须连续摆放k,长度为n的摆放方案数,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=1e5+10,M=0,Z=1e9+7,ms63=1061109567;
int f[N],s[N];
int n,k,l,r;
int main()
{
while(~scanf("%d%d",&n,&k))
{
f[0]=s[0]=1;
for(int i=1;i<=100000;++i)
{
f[i]=f[i-1];
if(i>=k)f[i]=(f[i]+f[i-k])%Z;
s[i]=(s[i-1]+f[i])%Z;
}
for(int i=1;i<=n;++i)
{
scanf("%d%d",&l,&r);
printf("%dn",(s[r]-s[l-1]+Z)%Z);
}
}
return 0;
}
/*
【题意】
我们要用黑白棋子摆成一列,其中黑色棋子必须k个一组连续摆放。
问你,对于长度为[1,n]的摆放,最终有多少种方案。
【类型】
DP
【分析】
这题我们用f[i]表示长度为i的合法摆放方案有多少种。
然后,对于每次在位置i的摆放,可以考虑这个位置是摆放白棋还是黑棋。
对应的状态转移前驱分别是f[i-1]和f[i-k]
然后记录一个前缀和,我们这道题就做完啦!
【时间复杂度&&优化】
O(n)
*/
最后
以上就是快乐小霸王为你收集整理的【Codeforces Round 271 (Div 2)D】【DP】Flowers 黑色必须连续摆放k,长度为n的摆放方案数的全部内容,希望文章能够帮你解决【Codeforces Round 271 (Div 2)D】【DP】Flowers 黑色必须连续摆放k,长度为n的摆放方案数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复