CHNTOWER - Tháp Hà Nội
Tác giả: hieult
Ngôn ngữ: C++
#include <stdio.h>
//#include <conio.h>
int main()
{
unsigned long long f[65][65],min=1;
int n,k,a[65];
for(int i = 1;i<=63;i++) min = min*2+1;
for(int i = 0;i<=64;i++)
for(int j = 0;j<=64;j++)
f[i][j]=0;
for(int j = 3;j<=64;j++)
{
for(int i =1;i<=j-2;i++)
a[i]=0;
f[1][j]=1;
for(int i = 2;i<=64;i++)
{
int flag = 0;
unsigned long long Min = min;
for(int t=1;t<=j-2;t++)
{
if(f[a[t]+1][j-t+1]-f[a[t]][j-t+1]<Min)
{
Min = f[a[t]+1][j-t+1]-f[a[t]][j-t+1];
flag = t;
}
}
//if(j==3 &&i<10)printf("i=%d Min=%llu flag=%d\n",i,Min,flag);
f[i][j]=f[i-1][j]+2*Min;
a[flag]++;
}
}
while(scanf("%d %d",&n,&k)>0)
printf("%llu\n",f[n][k]);
// getch();
}