每日一题<积木画>

简介: 每日刷题

image.png根据题目来看,要求所有的排列方法,由于整个积木只有两行因此比较简单一点。dp是一个二维数组分别表示列和当前积木画的状态。0为空,1为第二层有木板第一层没有,2为第一层有木板第二层没有,3为满。

其实说白了当前列为空即上一列是满的,由此dp[i][0] = dp[i-1][3],于是对dp的初始化便是dp[1][3] = 1,dp[1][0]= 1。

接着考虑dp[i][1]的状况,状态为1则说明当前列上行是没有木块而下层有,那么就有两种可能实现这个情况,

image.png

image.png

即可以换算成dp[i][1] = dp[i-2][3] + dp[i-1][1]。

而dp[i][2]则相反dp[i][2] = dp[i-1][0] + dp[i-1][1]。

dp[i][3]则有四种情况

image.png

image.png

image.png

image.png

由此dp[i][3] = dp[i-2][3] + dp[i-1][3] + dp[i-1][1] + dp[i-1][2]。

直接上源码

#include<iostream>
using namespace std;
int n;
long long dp[10000000][3];
#define mod 1000000007
int main()
{
  cin >> n;
  dp[0][3] = 1;
  dp[1][3] = 1;
  for (int i = 2; i <= n; i++)
  {
    dp[i][0] = dp[i - 1][3];
    dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % mod;
    dp[i][2] = (dp[i - 1][0] + dp[i - 1][1]) % mod;
    dp[i][3] = (dp[i - 2][3] + dp[i - 1][3] + dp[i - 1][1] + dp[i - 1][2]) % mod;
  }
  cout << dp[n][3];
  return 0;
}

image.gif

目录
相关文章
|
9月前
|
算法 Java 程序员
Python专家解读垃圾回收&lt;&lt;二&gt;&gt;
Python专家解读垃圾回收&lt;&lt;二&gt;&gt;
Python专家解读垃圾回收&lt;&lt;二&gt;&gt;
|
9月前
|
算法 Java Python
Python专家解读垃圾回收&lt;&lt;三&gt;&gt;
Python专家解读垃圾回收&lt;&lt;三&gt;&gt;
Python专家解读垃圾回收&lt;&lt;三&gt;&gt;
|
JavaScript 人工智能
|
Web App开发 JSON API
【Qt编程】基于Qt的词典开发系列&lt;九&gt;--JSON数据解析
在上一篇文章《用户登录及API调用的实现》中,我通过程序实现了用户登录及API调用的实现,从而能够实现网络查词、添词的操作。
1331 0
【LeetCode从零单排】No112 Path Sum
题目 Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example:Given the below binary tree and s
843 0
gtd阅读笔记1
自然式计划模式的5个步骤: 1 定义目标和原则 2 展望成果(前景展望) 3 集思广益(发散思考) 4 组织管理 5 明确下一步的行动方案 GTD: 行动前的思考和策划具有关键性的作用,能够让你不再忙乱
817 0