1. 程式人生 > >hdu1207 漢諾塔II 簡單dp

hdu1207 漢諾塔II 簡單dp

題意:漢諾塔,多了一根柱子,問你尋找最快的移動次數。

dp [ n ] = dp [ n - j ] * 2 + pow( 2, j ) - 1;

就是把j個漢諾塔移到一根上dp[ n - j ],然後就是普通的漢諾塔問題,即2^n - 1次移動,

然後把剩下的移動過去dp [ n - j ].

注意pow(2, j )可能超出long long int範圍。寫二的次方的時候也可用移位演算法。

#include <iostream>
#include <cstdio>
#include <string.h>

using namespace std;

#define lln long long int
#define min(a, b) a < b ? a : b

lln dp[65];
//for pow
lln temp, ans, tt;

lln pow(lln x, lln n)
{
    temp = x, ans = 1, tt = n;
    while(tt)
    {
        if(tt &1)
            ans = (ans * temp);
        temp = temp * temp;
        tt = tt >> 1;
    }
    return ans;
}

lln pow2(lln x)
{
    lln i = 0;
    lln j = 1;
    while(i < x)
    {
        j <<= 1;
        i++;
    }
    return j;
}

void init()
{
    memset(dp, 0x3f, sizeof(dp));
    dp[1] = 1;
    dp[2] = 3;
    dp[3] = 5;
    lln tmp;
    for(int i = 4; i <= 64; i++)
        for(int j = 1; j < i; j++)
        {
            tmp = pow(2, j);
            if(tmp > dp[i])
                break;
            dp[i] = min(2 * dp[i - j] + tmp - 1, dp[i]);

        }
}

void ace()
{
    int t;
    init();
    while(~scanf("%d", &t))
        printf("%lld\n", dp[t]);
}

int main()
{
    ace();
    return 0;
}


相關推薦

hdu1207 II 簡單dp

題意:漢諾塔,多了一根柱子,問你尋找最快的移動次數。 dp [ n ] = dp [ n - j ] * 2 + pow( 2, j ) - 1; 就是把j個漢諾塔移到一根上dp[ n - j ]

hdu1207II四柱

Problem Description 經典的漢諾塔問題經常作為一個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令婆羅門把

HDU1207 II 【遞推】

漢諾塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4799    Accepted Submis

hdu1207II

問題描述:在經典漢諾塔的基礎上加一個條件,即,如果再加一根柱子(即現在有四根柱子a,b,c,d),計算將n個盤從第一根柱子(a)全部移到最後一根柱子(d)上所需的最少步數,當然,也不能夠出現大的盤子放在小的盤子上面。注:1<=n<=64; 分析:設F[n]為

Hdu 1207 II

scanf 是個 故事 font cep 麻煩 快的 nbsp str 漢諾塔II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis

HDU 1207 II (遞推)

return main 世界 個數 也會 來源 esp 一次 移動 經典的漢諾塔問題經常作為一個遞歸的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令

系列問題: IIIII、IV、V、VI、VII

 漢諾塔II:(hdu1207) /先說漢若塔I(經典漢若塔問題),有三塔,A塔從小到大從上至下放有N個盤子,現在要搬到目標C上, 規則小的必需放在大的上面,每次搬一個,求最小步數。這個問題簡單,DP:a[n]=a[n-1]+1+a[n-1],先把上面的n-1個放在B上,把

+ 一道簡單貪心題

漢諾塔 移動n層塔至少需要多少次 1層 1次 2層 3次 3層 7次 4層 15次 . . . . 沒錯,就是2n+1的規律 int han(int n) { if(n==1) return 1; else r

遊戲簡單玩法

今天學習遞迴的時候,書上以一款名叫<漢諾塔>的解謎遊戲為例。雖然開始被那演算法搞蒙了,不過我倒是把這遊戲的玩法給解出來了,這裡分享一下. 遊戲簡介: 遊戲裡有三根金剛石柱子,左邊的柱子上從下往上按照大小順序摞著N片黃金圓盤。玩家需要做的是把圓盤從下面開始按

HDU 1207 II --遞推

題意:Gardon是個怕麻煩的人(恩,就是愛偷懶的人),很顯然將64個圓盤逐一搬動直到所有的盤子都到達第三個柱子上很困難,所以Gardon決定作個小弊,他又找來了一根一模一樣的柱子,通過這個柱子來更快

系列問題: IIIII、IV、V、VI

漢諾塔 漢諾塔II hdu1207: 先說漢若塔I(經典漢若塔問題),有三塔,A塔從小到大從上至下放有N個盤子,現在要搬到目標C上, 規則小的必需放在大的上面,每次搬一個,求最小步數。這個問題簡單,D

BNUOJ 34978 (概率dp

pre lin for ron 2.0 pla return popu while 題目分析:對於 i 個盤 , 須要移動多少步,取決於最大的盤子在哪個桿上。在C桿上,則最大的盤不須

bzoj1019: [SHOI2008](dp)

++ 有一種 -- scrip bbs input www 滿足 -1 1019: [SHOI2008]漢諾塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1739 Solved: 1062[Submit][Stat

python寫簡單的圖形界面解題器

color 一個 let 參考 span tkinter try import count 下圖是漢諾塔遊戲的簡單圖示,我們要把x柱子上面的移動到z軸上面(漢諾塔遊戲規則可以自行搜索,這裏不做介紹) 需要引入tkinter和ScrolledText模塊,下面直接貼代碼(我

問題其實很簡單

推出 class 回溯思想 除了 source 問題 容易 假設 為我 首先上代碼 1 def hanoi_move(n, source, dest, intermediate): 2 if n >= 1: # 遞歸出口,只剩一個盤子 3

簡單問題【遞迴】

題目連結:http://bailian.openjudge.cn/practice/4147/ 問題描述: 有三根杆子A,B,C。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆: 每次只能移動一個圓盤; 大盤不能疊在小盤上面。 提示:可將圓盤

簡單全面分析問題!!!!

初學者分析漢諾塔問題,更通俗的講就是圓盤移動,其實只要簡單將任意個圓盤分解為兩個總體移動就好!!!! (簡單通俗易懂,希望能得到大家的支援能幫到大家,也希望能有人能一起討論c++問題,我是學c++的,我也只是個初學者!!!!) 分析來看**a**是目標所在

Problem A: 深入淺出學演算法022-問題II

#include<stdio.h> void hanio(int n,char a,char b,char c) { if(n==1) printf("%c->%c\n",a,c); else{ hanio(n-1,a,c,b);

簡單演算法解決問題

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三

python實現簡單問題

漢諾塔問題可以簡單描述成為將a柱子上的圓盤按一定規則藉助b柱子完美地複製到c柱子上。現假設有a,b,c三根柱子,a柱子上的圓盤從上到下依次標號為1,2,3,……,n,且為遞增狀態。規則:每次移動一個盤子,且只能讓小的放在大的上面。目標:移動到c柱子上,與原來a上