题意:从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;
}
本文介绍了一种使用动态规划解决从特定起点出发,在给定步数内返回起点的路径计数问题的方法。通过定义状态转移方程,计算出在第i步到达任意一点j的方法数,并最终输出到达目标点的总方案数。此算法适用于解决图论中关于路径计数的问题。
161





