每日一题——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;
}

浙公网安备 33010602011771号