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();
}

Download