本来我们是想求走N步有多少条路径,我们可以把所有路径归类为3种,第i步向上走,向左走,向右走。也就是dp[i]=l[i]+r[i]+u[i]。而所有第i步向上走的路径,又可以由第i-1步向左,右,上的路径得到。第i步向左走向右走的路径同理。于是我们就得到了递推公式。本来是应该用dp[1001][3]来递推的,但经过数学运算发现可以优化。
类似之前的可除性之类的问题,把子问题的结果分类来存储。
#include<bits/stdc++.h>
using namespace std;
int dp[1001];
int N;
int main(){
cin>>N;
dp[1]=3;
dp[2]=7;
for(int i=3;i<=N;i++) dp[i]=(2*dp[i-1]+dp[i-2])%12345;
cout<<dp[N];
}