每日一题<积木画>

简介: 每日刷题

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

目录
相关文章
|
机器学习/深度学习 人工智能 BI
The Great Hero(Codeforces Round #700 (Div. 2))模拟+贪心思想和排序
The Great Hero(Codeforces Round #700 (Div. 2))模拟+贪心思想和排序
63 0
|
算法 Python
算法创作|PTA-求满足条件的斐波那契数
算法创作|PTA-求满足条件的斐波那契数
190 0
|
JavaScript 人工智能
|
SQL Shell
HDU-4348 To the moon(主席树区间修改 永久化标记)
HDU-4348 To the moon(主席树区间修改 永久化标记)
150 0
HDU-4348 To the moon(主席树区间修改 永久化标记)
【1128】N Queens Puzzle (20分)【逻辑题】
【1128】N Queens Puzzle (20分)【逻辑题】 【1128】N Queens Puzzle (20分)【逻辑题】
118 0