题意:四个pole的汉诺塔,求所要移动的步数。
思路:很明显的Dp,用递归去做。也可以打表,很邪恶。
依然的打表:(真的好邪恶,哈哈~~~)
#include<iostream>
using namespace std;
int main(){
cout<<"1\n3\n5\n9\n13\n17\n25\n33\n41\n49\n65\n81\n";
return 0;
}
递归的做法:
#include <iostream>
using namespace std;
int hanoi3[13], hanoi4[13];
int main(){
int i, j;
hanoi3[1]= hanoi4[1]= 1;
puts("1");
for( i= 2; i<= 12; i++ )
hanoi3[i]= 2*hanoi3[i-1]+1;
for( i= 2; i<= 12; i++ ){
hanoi4[i]= 2+hanoi3[i-1];
for( j= 2; j< i; j++ )
if( hanoi4[i]> 2*hanoi4[j]+hanoi3[i-j] )
hanoi4[i]= 2*hanoi4[j]+hanoi3[i-j];
printf("%d\n",hanoi4[i]);
}
return 0;
}