每日一题<积木画>

简介: 每日刷题

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

目录
相关文章
|
PHP
Ctfshow基础二刷(1)
Ctfshow基础二刷(1)
68 0
|
算法 C语言 C++
【九章斩题录】C/C++:二维数组中的查找(JZ4)
【九章斩题录】C/C++:二维数组中的查找(JZ4)
143 0
|
JavaScript 人工智能
|
算法 C++
利用动态规划算法解01背包问题-&gt;二维数组传参-&gt;cpp内存管理-&gt;堆和栈的区别-&gt;常见的内存错误及其对策-&gt;指针和数组的区别-&gt;32位系统是4G
1、利用动态规划算法解01背包问题 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 两层for循环,依次考察当前石块是否能放入背包。
1348 0
|
自然语言处理 API 前端开发
【Qt编程】基于Qt的词典开发系列&lt;六&gt;--界面美化设计
   本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验。现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来。
1407 0
|
自然语言处理 API 数据格式
【Qt编程】基于Qt的词典开发系列&lt;五&gt;--无边框窗口的拖动
       在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口。
1201 0