【POJ1958】【典型递推问题】汉诺塔问题

题意:

      给你n个盘子,问在四个柱子的情况下,最少需要多少步才能将n个盘子移动到另一个柱子上。

思路:

      先来看看最经典的三个柱子问题。

      f3[i] = 2*f3[i-1]+1,即将(i-1)个盘子移动到中间那根柱子上,然后再将最后一个盘子移动到目标柱子上,最后将(i-1)个盘子移动到目标柱子上即可。

      那么对于四根柱子的话,我们可以先将i个盘子移到B柱子上,然后再将剩下的盘子按照三根柱子的移法移到目标柱子上,然后B柱子上的i个盘子再按四根柱子的移法移动到目标柱子即可。

      所以 f4[n] = min(2*f4[i]+f3[n-i])。

总结:

      汉诺塔问题是典型的递推问题,此问题也可以拓展到m个柱子,n个盘子上,思路都是统一的进行递推。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;

int f3[15],f4[15];

void init()
{
	f3[1] = 1;
	rep(i,2,12)
		f3[i] = 2*f3[i-1]+1;
}

int main()
{
	int n = 12;
	init();
	memset(f4,0x3f,sizeof f4);
	f4[1] = 1;
	rep(i,2,n)
	{
		rep(j,1,i-1)
		{
			f4[i] = min(f4[i],f4[j]+f3[i-j]+f4[j]);
		}
	}
	rep(i,1,12)
		printf("%d\n",f4[i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41552508/article/details/83351187