动态规划(相同地方不同状态)
竞赛中心 - 蓝桥云课
#include <iostream>
using namespace std;
#define int long long
const int A=10000001;
const int mod=1000000007;
int dp[A][3];
signed main()
{// 请在此输入您的代码int N;cin>>N;dp[1][0]=1;dp[2][0]=2;dp[2][1]=1;dp[2][2]=1;for(int i=3;i<=N;i++){dp[i][0]=(dp[i-1][0]+dp[i-2][0]+dp[i-1][1]+dp[i-1][2])%mod;dp[i][1]=(dp[i-1][2]+dp[i-2][0])%mod;dp[i][2]=(dp[i-1][1]+dp[i-2][0])%mod;}cout<<dp[N][0]%mod<<endl;return 0;
}
当列数为i时有一下的三种方案:
设dp[i][j]表示在列数为i时,此时图形的状况为j时的方案数,j的大小为0,1,2三种图形情况。
状态转移方程:
dp[i][0]=(dp[i-1][0]+dp[i-2][0]+dp[i-1][1]+dp[i-1][2])%mod;dp[i][1]=(dp[i-1][2]+dp[i-2][0])%mod;dp[i][2]=(dp[i-1][1]+dp[i-2][0])%mod;
第一种情况:变成第一种图形情况的可能情况,在i-1列时就为第一种图形情况(在放一个竖放的图形),在i-2列时为第一种图形情况(放两个横放的图形),在i-1列时为第二种图形的情况,在i-1列时为第三种图形情况。
第二种情况:变成第二种图形情况的可能情况,在i-1列时为第三种图形情况(将第一个图形放在上面空格处),在i-2列时为第一种图形情况。
第三种情况:变成第三种图形情况,与第二种情况的状态转移方程逻辑相似,只是放的在下面。