动态规划代码
最开始2个格子未铺满为(0,0),可以根据两个格子是否铺满来决定下一层的情况
每一层我们都铺满,并且获得下一层是否铺上是积木分四种情况
最后一层也就是扑到越界时我们得保证此层也为未铺满(0,0)
#include <iostream>
#include <string>
#include <vector>
#include <functional>
using namespace std;
#include <queue>
#include <algorithm>
#include <set>
#include <stack>
#include <map>
int dp[1000000][2][2];
int process2(int n, int p1, int p2)
{
dp[0][0][0] = 1;
dp[0][1][0] = 0;
dp[0][1][1] = 0;
dp[0][0][1] = 0;
for (int i = 1; i <= n; i++)
{
dp[i][1][1] = dp[i - 1][0][0];
dp[i][0][1] = dp[i - 1][1][0] + dp[i - 1][1][1];
dp[i][0][0] = dp[i - 1][1][1] + dp[i - 1][0][1] + dp[i - 1][1][0] + dp[i - 1][0][0];
dp[i][1][0] = dp[i - 1][0][1] + dp[i - 1][1][1];
}
return dp[n][p1][p2];
}
int main()
{
int n;
cin >> n;
int num = process2(n,0,0);
cout << num;
return 0;
}
由于数据是10的7次方所以得使用状态压缩,还有取模这样才能ac
long long dp[2][2][2];
long long process2(int n, int p1, int p2)
{
dp[0][0][0] = 1;
dp[0][1][0] = 0;
dp[0][1][1] = 0;
dp[0][0][1] = 0;
int cur=1;
int pre=1;
for (int i = 1; i <= n; i++)
{
pre=cur==0?1:0;
dp[cur][1][1] = dp[pre][0][0]%1000000007;
dp[cur][0][1] = (dp[pre][1][0] + dp[pre][1][1])%1000000007;
dp[cur][0][0] = (dp[pre][1][1] + dp[pre][0][1] + dp[pre][1][0] + dp[pre][0][0])%1000000007;
dp[cur][1][0] = (dp[pre][0][1] + dp[pre][1][1])%1000000007;
cur=pre;
}
return cur?dp[0][0][0]:dp[1][0][0];
}
int main()
{
int n;
cin >> n;
long long num = process2(n,0,0);
cout << num;
return 0;
}