题目链接:https://codeforces.com/contest/1369/problem/D

题意

最初有一个结点,衍生规则如下:

  • 如果结点 $u$ 没有子结点,添加 $1$ 个子结点
  • 如果结点 $u$ 有 $1$ 个子结点,添加 $2$ 个子结点
  • 如果结点 $u$ 有 $3$ 个子结点,跳过该结点

如:

\begin{equation} level = 1, 2, 3,4 \end{equation}

爪形结构如下:

问可以在 $level_n$ 选出几个互不相交的爪形结构。

题解

衍生的过程是具有重复性的,最终变化的是根结点 $1$ 下的三棵子树,左右两棵子树为 $level_{n - 2}$,中间的子树为 $level_{n - 1}$ 。

因为 $level_1$ 和 $level_2$ 的根结点并未使用,所以可以在 $level_3$ 中选择以根结点 $1$ 为中心的爪形结构。

同理,$level_4$、$level_5$ 可以通过选取较下层的爪形结构来避免根结点的使用,所以在 $level_6$ 中又可以选取以根结点 $1$ 为中心的爪形结构。

即,$level$ 为 $3$ 的倍数的图形都可以再额外选取位于根结点的爪形结构。

综上,设 $dp_i$ 为 $level_i$ 中最多可选出的互不相交的爪形结构个数,有递推式:

\begin{equation} dp_i = 2 \times dp_{i - 2} + dp_{i - 1} + (i\ \%\ 3 == 0) \end{equation}

代码

#include <bits/stdc++.h>
using namespace std;
constexpr int N = 2e6 + 10;
constexpr int mod = 1e9 + 7; int dp[N]; void init() {
dp[1] = dp[2] = 0;
dp[3] = dp[4] = 1;
for (int i = 5; i < N; i++)
dp[i] = (2LL * dp[i - 2] + dp[i - 1] + (i % 3 == 0)) % mod;
} void solve() {
int n; cin >> n;
cout << 4LL * dp[n] % mod << "\n";
} int main() {
init();
int t; cin >> t;
while (t--) solve();
}

Codeforces Round #652 (Div. 2) D. TediousLee(dp)的更多相关文章

  1. Codeforces Round #260 (Div. 2)C. Boredom(dp)

    C. Boredom time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  2. Codeforces Round #652 (Div. 2) C. RationalLee(贪心)

    题目链接:https://codeforces.com/contest/1369/problem/C 题意 将 $n$ 个数分给 $k$ 个人,每个人分 $w_i$ 个数($\sum_{i = 1}^ ...

  3. Codeforces Round #652 (Div. 2) E. DeadLee(贪心)

    题目链接:https://codeforces.com/contest/1369/problem/E 题意 Lee 有 $n$ 种不同种类的食物和 $m$ 个朋友,每种食物有 $w_i$ 个,每个朋友 ...

  4. Codeforces Round #652 (Div. 2) B. AccurateLee(字符串)

    题目链接:https://codeforces.com/contest/1369/problem/B 题意 给出一个长 $n$ 的 二进制串,每次可以选择字符串中的一个 $10$,然后删除其中的一个字 ...

  5. Codeforces Round #652 (Div. 2) A. FashionabLee(几何)

    题目链接:https://codeforces.com/contest/1369/problem/A 题意 判断正 $n$ 边形能否通过旋转使得一边与 $x$ 轴平行,一边与 $y$ 轴平行. 题解 ...

  6. Codeforces Round #658 (Div. 2) D. Unmerge(dp)

    题目链接:https://codeforces.com/contest/1382/problem/D 题意 给出一个大小为 $2n$ 的排列,判断能否找到两个长为 $n$ 的子序列,使得二者归并排序后 ...

  7. Codeforces Round #471 (Div. 2) F. Heaps(dp)

    题意 给定一棵以 \(1\) 号点为根的树.若满足以下条件,则认为节点 \(p\) 处有一个 \(k\) 叉高度为 \(m\) 的堆: 若 \(m = 1\) ,则 \(p\) 本身就是一个 \(k\ ...

  8. 【Codeforces】Codeforces Round #374 (Div. 2) -- C. Journey (DP)

    C. Journey time limit per test3 seconds memory limit per test256 megabytes inputstandard input outpu ...

  9. Codeforces Round #247 (Div. 2) C. k-Tree (dp)

    题目链接 自己的dp, 不是很好,这道dp题是 完全自己做出来的,完全没看题解,还是有点进步,虽然这个dp题比较简单. 题意:一个k叉树, 每一个对应权值1-k, 问最后相加权值为n, 且最大值至少为 ...

随机推荐

  1. ACL技术(访问控制列表)

    • Access Control List    • 访问控制列表    • 是一种包过滤技术    • ACL基于IP包头的IP地址.四层TCP/UDP头部的端口号.[五层数据]进行过滤    • ...

  2. Viser报错:dodge is not support linear attribute, please use category attribute!

    遇到这样的问题是因为x轴数据不能为为连续性的日期(日期格式为:YYYY-MM-DD),需要设置为分类属性(cat),有一些可能设置为timeCat,看具体情况 scale 参数支持以下类型 • ide ...

  3. LeetCode117 每个节点的右向指针 II

    给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...

  4. 敏捷史话(四):敏捷是人的天性 —— Arie van Bennekum

    敏捷是人的天性,是你与生俱来的东西.面对敏捷,Arie van Bennekum 下了这样一个结论. 但这并不意味着人们只能通过天赋获得敏捷,对于想要学习敏捷的人来说,敏捷绝不是仅仅靠学习僵化的框架. ...

  5. SpringBoot 好“吃”的启动原理

    原创:西狩 编写日期 / 修订日期:2020-12-30 / 2020-12-30 版权声明:本文为博主原创文章,遵循 CC BY-SA-4.0 版权协议,转载请附上原文出处链接和本声明. 不正经的前 ...

  6. python_mmdt:从0到1--实现简单恶意代码分类器(二)

    概述 上篇文章python_mmdt:一种基于敏感哈希生成特征向量的python库(一)我们介绍了一种叫mmdt_hash(敏感哈希)生成方法,并对其中的概念做了基本介绍.本篇,我们重点谈谈mmdt_ ...

  7. linux驱动设备号

    一.设备号基础 一般来说,使用ls -l命令在时间一列的前一列的数字表示的是文件大小,但如果该文件表示的是一个设备的话,那时间一列的前一列将有两个数字,用逗号分隔开,如下图: 前一个数字表示主设备号, ...

  8. 使用Python对MySQL数据库插入二十万条数据

    1.当我们测试的时候需要大量的数据的时候,往往需要我们自己造数据,一条一条的加是不现实的,这时候就需要使用脚本来批量生成数据了. import pymysql import random import ...

  9. jQuery 多选与清除

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. MySQL调优用户监控之show processlist

    简介 show processlist显示这台MySQL正在连接的用户: mysql> show processlist; +----+------+-----------+-------+-- ...