文章

1

粉丝

28

获赞

0

访问

335

头像
双层汉诺塔 题解:
P1743 杭州电子科技大学机试题
发布于2024年7月23日 15:43
阅读数 335

#include <iostream>
using namespace std;

const int MOD = 998244353;

int main() {
    int n;
    while (cin >> n) {
        long long dp[n+1];
        dp[1] = 3; // 当n=1时,需要移动3次
        for (int i = 2; i <= n; ++i) {
            dp[i] = (2 * dp[i - 1] + 5) % MOD;
        }
        cout << dp[n] << endl;
    }
    return 0;
}

由于递归的深度可以达到1e6,这会导致非常高的调用栈,从而导致栈溢出。可以使用动态规划来避免递归造成的栈溢出问题。
 

代码中使用了一个数组dp来存储从1到n每个状态下的最小移动次数。这样就避免了递归调用,转而使用迭代的方式来填充这个数组。每次计算dp[i]时,只需要查看dp[i-1]的值即可,大大减少了计算量,并且避免了栈溢出的问题。

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发