【递推dp】B000_NK_走楼梯(三维记忆化)

小x一定要走到第 n 阶楼梯,每次都可以跨 1~m 步,且当前的跨步不能和前两部相同,小x有几种方案恰好走到第 n 阶楼梯

方法一:记忆化

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7, N=1e5+5;
int n, m, ans, f[N][10][10];

int dfs(int i, int p1, int p2) {
    if (i>n) return 0;
    if (i==n)return 1;
    if (f[i][p1][p2]!=-1) return f[i][p1][p2];
    int t=0;
    for (int j=1; j<=m; j++) if (j!=p1 && j!=p2) {
        t=(t+dfs(i+j, j, p1))%mod;
    }
    return f[i][p1][p1]=t;
}
int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    memset(f, -1, sizeof f);
    cout << dfs(0, 0, 0);
    return 0;
}

复杂度分析

  • Time\(O(nm)\)
  • Space\(O(nm)\)
posted @ 2020-09-04 09:19  童年の波鞋  阅读(155)  评论(0编辑  收藏  举报