1 solutions

  • 0
    @ 2024-3-6 15:39:26

    [算法分析] 1.先考虑三个汉诺塔,三个汉诺塔的容易知道是d[i]=2*d[i]+1 ,d[1]=1

    2.如果将j个移动到某个柱子上,剩余的只能使用三个柱子来移动了。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=55;
    int f[N],d[N]; 
    int main()
    {	
    	int n;
    	cin>>n;
    	//首先是三塔
    	d[1]=1;
    
    	for(int i=2;i<=n;i++)
    	{
    		d[i]=d[i-1]*2+1;//先i-1=>b,i=>c,i-1=>b;	
    	} 
    	memset(f,0x3f,sizeof f);
    	f[0]=0;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=0;j<=i;j++)
    		{
    			f[i]=min(f[i],f[j]+d[i-j]+f[j]);
    			//4个柱子移动j个盘子,i-j个盘子就只能3个柱子移动,j个盘子再由4个柱子移动回去 
    		}
    	}
    	cout<<f[n];
    	return 0;
    }
    
    • 1

    Information

    ID
    1260
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    (None)
    # Submissions
    9
    Accepted
    3
    Uploaded By