每日一题——Strange Towers of Hanoi

题目

Strange Towers of Hanoi

题解

如果只有三根柱子的话,记d[i]为移动次数,那就需要将上面i-1跟移动到其中一个盘子,然后最下面那根放到目标盘子,最后将i-1放在目标盘子上,可以得到递推式为

d[i] = 1 + d[i - 1] * 2;

那么如果有四根柱子的话,记f[i]为移动次数,那就可以先将j个移动到B盘中,需要f[j]移动次数,然后剩下的i-j就变成了三盘问题,三盘问题的解是d[i - j],最后将j个盘子放到目标盘子上,所以得到递推式为

f[i] = min(f[i],f[j] * 2 + d[i - j]);

参考代码

#include<iostream>
#include<cstring>
using namespace std;
const int N = 20;
int d[N], f[N];
int main(){
    d[1] = 1;
    for(int i = 1; i <= 12; i ++)
        d[i] = 1 + d[i - 1] * 2;
    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    for(int i = 1; i <= 12; i ++){
        for(int j = 0; j < i; j ++){
            f[i] = min(f[i], f[j] * 2 + d[i - j]);
        }
    }
    for(int i = 1; i <= 12; i ++) cout << f[i] << endl;
    return 0;
}
posted @ 2025-03-06 19:33  PZnwbh  阅读(6)  评论(0)    收藏  举报