题目链接:https://codeforces.com/problemset/problem/166/E
解题思路:第n步要回到D点,所以在第n-1步除了当前点和D点,还有两个点可以走,在第n-2步,出了当前点还有三个点可以走,所以就可以推出递推公式dp[i]=2*dp[i-1]+3*dp[i-2]
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
int n;
long long dp[maxn];
void solve(){
dp[1]=0;
dp[2]=3;
for(int i=3;i<=n;i++){
dp[i]=(dp[i-1]*2+dp[i-2]*3)%1000000007;
}
cout<<dp[n];
return ;
}
void INPUT(){
scanf("%d",&n);
solve();
}
int main()
{
INPUT();
//solve();
return 0;
}
内存超限代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
int n;
long long dp[maxn][4];
void solve(){
for(int i=1;i<=3;i++)dp[1][i]=1;
for(int i=2;i<=n-1;i++){
for(int j=1;j<=4;j++){
for(int k=1;k<=4;k++){
if(k!=j){
dp[i][j]+=dp[i-1][k];
}
}
}
}
long long res=0;
for(int i=1;i<=3;i++){
res=(res+dp[n-1][i])%1000000007;
}
cout<<res;
return ;
}
void INPUT(){
scanf("%d",&n);
solve();
}
int main()
{
INPUT();
//solve();
return 0;
}