CF474D Flowers (计数dp)

原题地址:https://codeforces.com/problemset/problem/474/D

题意:有两种花可以吃,white花只能连续吃k个,red花不受限制,当吃a到b朵花时一共有多少种吃法?

思路:dp定义状态见代码.
设当前最后的花是红花,那么它前面的无论是红花还是白花都是合法的.
若当前最后的花是白花,那么它前面必须是 k − 1 k-1 k1个百花,所有状态是由 i − k i-k ik转移得来.

#include 
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int dp[maxn][2];//dp[i][0]表示前i种花第i种花是白色方案数,1表示红花的方案数
int sum[maxn];
int T, k;
int main() {
    scanf("%d%d", &T, &k);
    for (int i = 0; i < maxn; i++) {
            if (i < k) {
                dp[i][0] = 0;
                dp[i][1] = 1;
            } else if (i == k) {
                dp[i][0] = 1;
                dp[i][1] = 1;
            } else {
                dp[i][0] = (dp[i - k][0] + dp[i - k][1]) % mod;
                dp[i][1] = (dp[i - 1][0] + dp[i - 1][1]) % mod;
            }
            int tmp = (dp[i][0] + dp[i][1]) % mod;
            if (i != 0)sum[i] = (sum[i - 1] + tmp) % mod;
        }
    while (T--) {
       
        int a, b;
        scanf("%d%d", &a, &b);
        printf("%d\n", (sum[b] - sum[a - 1] + mod) % mod);
    }
    return 0;
}



你可能感兴趣的:(CF_基础)