题意:从D点出发,输入一个n,代表行走的步数,每一步可以从一个点到达另一个点,计算走n步回到D点放法数。
例如n等于2时
- D - A - D
- D - B - D
- D - C - D
分析:这个dp主要是要找到dp[i][j],这里的dp[i][j]代表是走到第i步时经过第j个点时的方法数,所以这里的j用0123代表点ABCD,最后只要输出dp[n][3]就是答案。那这个转移方程就是if(j!=k) dp[i][j]+=dp[i-1][k];就是相当于当前步数的一个点的方法数是前一步其他三个点方法数之和,例如走第2步到达的D的方法数是走第一步到达A,B,C的放法数(分别是一种)之和。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int dp[10000010][4];
int main(){
int n;
cin>>n;
dp[0][3]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
if(j!=k){
dp[i][j]+=dp[i-1][k];
dp[i][j]%=mod;
}
}
}
}
cout<<dp[n][3]<<endl;
}