hdu1207 汉诺塔II 简单dp

本文出自:http://blog.csdn.net/svitter

题意:汉诺塔,多了一根柱子,问你寻找最快的移动次数。

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,布布扣,bubuko.com

时间: 2024-12-22 18:25:11

hdu1207 汉诺塔II 简单dp的相关文章

hdu1207 汉诺塔II (DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘.有预言说,这件事完成时宇

HDU 1207 汉诺塔II (简单DP)

题意:中文题. 析:在没有第四个柱子时,把 n 个盘子搬到第 3 个柱子时,那么2 ^ n -1次,由于多了一根,不知道搬到第四个柱子多少根时是最优的, 所以 dp[i] 表示搬到第4个柱子 i 个盘子时,步数最少,dp[i] = min{ dp[j] + (1<<i-j) - 1}. 也可以找规律,多写几个就发现规律. 代码如下: 找规律: #pragma comment(linker, "/STACK:1024000000,1024000000") #include &

HDU1207 汉诺塔II 【递推】

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4799    Accepted Submission(s): 2362 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下

HDU1207 汉诺塔II(递推)

汉诺塔II Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘.有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭.也有人相信婆罗门至今仍在一刻不停地搬动着圆盘.恩,当然这个传说并不可

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

汉诺塔II(hdu1207)经典递推

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6070    Accepted Submission(s): 2966 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下

汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII

汉诺塔II:(hdu1207) /先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,如今要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,DP:a[n]=a[n-1]+1+a[n-1],先把 上面的n-1个放在B上,把最大的放在目标C上,再把N-1个放回到C上就可以. </pre><p></p>如今是汉若塔II,改为四个塔,開始方程想简单了,不是最优的.给出网上的一种最优解法例如以下:(1)将x(1<=x&l

Hdu 1207 汉诺塔II

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8433    Accepted Submission(s): 4162 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

汉诺塔的简单递归思想

最近在校招打酱油,闲得没事想起了大一学过的汉诺塔,不过那时只知道玩游戏,一次性3~7个玩过了,还是有成就感的呵呵.游戏链接:http://www.7k7k.com/swf/335.htm. 看了网上很多递归方法,像 1 #include<stdio.h> 2 3 void move(int n,char a,char b,char c) 4 { 5 if(n==1) 6 printf("\t%c->%c\n",a,c); 7 else 8 { 9 move(n-1,a