标签:names string 模式 printf algorithm memset def range cst
n盘4塔问题可以分为3步:
1.以4塔模式移走i个盘。
2.以3塔模式将剩余n-i个盘移至第4塔。
3.以4塔模式将第一步中的i个盘移至第4塔。
我们用\(d[i]\)表示在3塔模式下移i个盘的最小步数,\(f[i]\)表示在4塔模式下移i个盘的最小步数。
递推式:\(f[i]=\min_{1\leq j < i}(2*f[j]+d[i-j])\)
本题可以拓展至n盘m塔问题。
\(f[i][j]\)表示在i塔模式下移j个盘的最小步数。
递推式:\(f[i][j]=\min_{1\leq k < j}(2*f[i][k]+f[i-1][j-k])\) (maybe
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 12 + 2;
typedef long long ll;
ll d[N],f[N];
//d=n盘3塔 f=n盘4塔
int main(){
for(int i=1;i<=12;i++){
d[i]=2*d[i-1]+1;
// printf("d[%d]=%d%c",i,d[i],i==12?‘\n‘:‘ ‘);
}
memset(f,0x3f,sizeof(f));
f[1]=1;printf("1\n");
for(int i=2;i<=12;i++){
for(int j=1;j<i;j++){
f[i]=min(f[i],2*f[j]+d[i-j]);
}
printf("%lld\n",f[i]);
}
return 0;
}
POJ1958 Strange Towers of Hanoi --- 递推【n盘m塔Hanoi塔问题】
标签:names string 模式 printf algorithm memset def range cst
原文地址:https://www.cnblogs.com/Loi-Brilliant/p/9763690.html