zoukankan      html  css  js  c++  java
  • 【Codeforces 1369-D】TediousLee 递推

    D. TediousLee

    题意

    定义 n 级的 RDB 树。

    n 级的 RDB 树,由 n-1 级的 RDB树,经如下转变得来:

    1. 如果某个节点没有子节点,那么为其增加一个节点
    2. 如果某个节点有两个子节点,那么为其增加两个子节点
    3. 其他不用管

    定义爪形图案如下:

    初始一个 n 级树都是绿色的,现在你可以选择 这样的爪形图案,其节点全都是绿色,并将它染成红色。问最多可以染多少个。

    思路

    其实看到数据范围感觉这题应该可以通过找规律,然后我就开始画图了,图有点恶心,越画越跳不出来,不好画。成功GG

    题解

    其实一个 n 级 RDB树,是一个根节点,左右两边分别连着一个 n-2 级的树,中间是一个 n-1 级的树。

    因为他们直接并不互相影响。我们定义 (f[i]) 表示 i 级的RDB树最多可以染多少,那么(f[i]=2*f[i-2]+f[i-1])

    这样并不正确,比如说现在 n-2 级和 n-1 级都没有使用其头结点,那么第 n 级就可以使用他们的头结点多形成一个,这只会在 n%3==0 的时候出现,递推公式改变为(f[i]=2*f[i-2]+f[i-1]+i\%3==0 ? 4:0)

    代码

    #include <bits/stdc++.h>
    #define pb push_back
    using namespace std;
    typedef long long ll;
    const int mod = 1e9 + 7;
    const int inf = 0x3f3f3f3f;
    const int N = 2e6+10;
    
    ll ans[N];
    int main()
    {
        ans[1] = 0;
        ans[2] = 0;
        ans[3] = 4;
        for(int i = 4; i < N; i++){
            ans[i] = 2 * ans[i-2] + ans[i-1];
            if(i%3 == 0) ans[i] += 4;
            ans[i] %= mod;
        }
        int T;
        scanf("%d" , &T);
        while(T--) {
            int n;
            scanf("%d", &n);
            printf("%lld
    ", ans[n]);
        }
        return 0;
    }
    
  • 相关阅读:
    第5次作业
    第六次作业
    第五次作业
    软件需求最佳实践阅读笔记05
    软件需求最佳实践阅读笔记04
    构建民航知识图谱
    软件需求最佳实践阅读笔记03
    软件需求最佳实践阅读笔记02
    软件需求最佳实践阅读笔记01
    程序员的自我修养阅读笔记03
  • 原文地址:https://www.cnblogs.com/valk3/p/13323959.html
Copyright © 2011-2022 走看看