zoj 2338

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

HanioTower的加强版


记f[n][m]为n个disc,m个peg的Hanoi问题,则有dp公式f[n][m]=min{f[n-k][m-1]+2*f[k][m]}。即把上面的k个disc利用m个peg转移某个中间peg,再把下面的n-k个disc利用m-1个peg转移到目标peg,最后把上面的k个disc利用m个peg移到目标peg。dp过程记下使得f[n][m]最小的g[n][m]=k用于反向打印移动过程。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include <stack>
using namespace std;
typedef unsigned long long ll;
const ll INF=(~(0ULL))>>1;
ll dp[70][70];
int pre[70][70];
stack<int>v[80];
int n,m;
bool was[80];

void move(int from,int to) //从a这根柱子移到b这跟柱子
{
    if(v[to].empty()) printf("move %d from %d to %d\n",v[from].top(),from,to);
    else printf("move %d from %d to %d atop %d\n",v[from].top(),from,to,v[to].top());
    v[to].push(v[from].top());
    v[from].pop();
    return ;
}

void dfs(int ct,int from,int to,int h) //ct 表示盘子个数 a,b表示柱子标号 通过h根的柱子来进行操作
{
    int i,j,k;
    if(ct==1)
    {
        move(from,to);
        return ;
    }
    for(i=1;i<=m;i++)
        if(i!=from && i!=to && was[i]==0)break;
    dfs(pre[ct][h],from,i,h);
    was[i]=1;
    dfs(ct-pre[ct][h],from,to,h-1);
    was[i]=0;
    dfs(pre[ct][h],i,to,h);
}
void init(){
    int i,j,k;
    for(i=1;i<=70;i++) dp[i][3]=2*dp[i-1][3]+1,pre[i][3]=i-1;
    for(i=4;i<=65;i++){   //柱子
        dp[1][i]=1;
        for(j=2;j<=64;j++){  //盘子
            ll tem=INF;
            for(k=1;k<j;k++){ //先移走k个盘子到一个中间柱子,剩下j-k盘子移动到目标;
                if(tem > dp[j-k][i-1]+dp[k][i]*2){
                    tem=dp[j-k][i-1]+dp[k][i]*2;
                    pre[j][i]=k;
                }
            }
            dp[j][i]=tem;
        }
    }
}
int main()
{
    int i,j,k,ca,kk;

    init();
    scanf("%d",&ca);
    while(ca--)
    {
        scanf("%d%d",&n,&m);
        printf("%lld\n",dp[n][m]);
        for(i=1;i<=m;i++)while(!v[i].empty())v[i].pop();
        for(i=n;i>=1;i--) v[1].push(i);
        memset(was,0,sizeof(was));
        dfs(n,1,m,m);
    }
    return 0;
}


记f[n][m]为n个disc,m个peg的Hanoi问题,则有dp公式f[n][m]=min{f[n-k][m-1]+2*f[k][m]}。即把上面的k个disc利用m个peg转移某个中间peg,再把下面的n-k个disc利用m-1个peg转移到目标peg,最后把上面的k个disc利用m个peg移到目标peg。dp过程记下使得f[n][m]最小的g[n][m]=k用于反向打印移动过程。
ACM-ICPC青岛赛区网络预选赛 C Halting Problem 题目链接https://vjudge.net/problem/ZOJ-4049   题目中的坑处:思路大家都很快能够想到,并且复杂度按道理来说也不会超,关键就是细节问题了,主要是输入输出,以及不能使用memset,多亏队友提醒,自己算死了也觉得不会超呀   AC代码 #include &lt;iostream&gt; #include&lt;cstring&gt; #include&l... 阅读详情

相关推荐

经典状态dp题目

POJ 1185 炮兵阵地 一般这类题目列会很小10左右,我们需要枚举所有行,对于当前行,其放炮的位置只与上一行和上上行有关,我们记当前行状态和上一行状态便可转移了,dp数组开3维即可。 在枚举每一行放炮兵的方法时,可以预处理方便获得所有可能放法。具体细节见代码。总体复杂度O(Row*70*70*70),70是预处理得到的每一行最多放法。打表很容易看出来。 #include #inclu

1292765944的专栏 3921

ZOJ-2338 The Towers of Hanoi Revisited 输出汉诺塔的最优解移动过程

题意:给定N(1&lt;= N &lt;=64)个盘子和M(4&lt;= M &lt;= 65)根柱子,问把N个盘子从1号柱子移动到M号柱子所需要的最少步数,并且输出移动过程。 分析:设f[i][j]表示将i个盘通过j个柱子从第一根柱子移动到最后一根柱子所需要的最少次数,f[i][j]的得到的最优移动方案是先将最小的path[i][j]个盘移动到某一根柱子上,然后通过一个dfs输出移动次序。 ...

weixin_34313182的博客 189

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 834

ZOJ Problem Set - 2338 The Towers of Hanoi Revisited DFS+预处理

ZOJ Problem Set - 2338 The Towers of Hanoi Revisited题目描述:  题目链接:Problem Set - 2338 The Towers of Hanoi Revisited题目大意:  给定N(1<= N <=64)个盘子和M(4<= M <= 65)根柱子,问把N个盘子从1号柱子移动到M号柱子所需要的最少步数,并且输出移动过程。解题思路:  对于

Running Boy的AC Dream 733

ZOJ - 4049 Halting Problem(模拟/bool)

Halting Problem 模拟了大半天,都超时,把状态标记数组变成bool类型之后就玄学ac了。而且快了非常多。 #include &lt;bits/stdc++.h&gt; using namespace std; #define clr(a) memset(a,0,sizeof(a)) const int N = 10100; const int Mod = 256; bo...

辞树 304

ZOJ - 4049 - Halting Problem (模拟)

题意: 按照题意模拟,如果能进行到n+1步,则yes,否则如果无限循环,则no; 思路: 记录一下每一步对应的状态,如果重复访问,则重复。 一定要用bool类型!!! #include <bits/stdc++.h> using namespace std; const int maxn = 1e4 + 3; int t,n; int v[maxn]; int k[maxn...

刘二狗的博客 335

The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online 青岛,C Halting Problem 模拟 + 卡常

博客目录 原题 传送门 作者: 浙江大学竞赛命题组 单位: ACMICPC 时间限制: 500 ms 内存限制: 64 MB 代码长度限制: 32 KB In computability theory, the halting problem is the problem of determining, from a description of an arbitrary comp...

GreyBtfly的博客 991

zoj 2338 The Towers of Hanoi Revisited

还是太naive了,在知道经典汉诺塔的情况下,居然很久没想出来。其实多根棍子和三根是一个原理。n个盘子,m根棍子的最优解,一定是把一部分盘子(假设为x)先移到某个中间棍子上,也就是先解决子问题(x,m),然后把剩下的n-x个盘子通过剩下的m-1根棍子用最优方案转移,即子问题(n-x,m-1),最后把中间棍子上的那x个盘子移过去,即子问题(x,m)。这样可以用dp来求解。#include <iostr

A Cube Master 432

POJ1068 LA2338 HDU1361 ZOJ1016 Parencodings【序列处理+括号匹配】

Parencodings Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 30527 Accepted: 17996 Description Let S = s1 s2…s2n be a well-formed string of parentheses. S can be encoded in two different ways: By an integer sequence P = p1 p2…pn where pi is t

海岛Blog 622

ACM各题型OJ题目总结 POJ、ZOJ、HDU

本帖题目类型: 目录 1、递归与分治(27) 2、动态规划类问题(189题) 3、贪心算法类问题(79) 4、回溯算法(36) 5、图的搜索(98) 6、图论(85) 7、数论(117) 8、组合数学(99) 9:、分支限界算法(14) 推荐网站:https://vjudge.net/ 下面给出各题型的部分例题。 注:1.题目来源于ZOJ,POJ和HUD; ...

一定要站在自己热爱的生活里闪闪发光 4万+

ACM训练

转自 本帖题目类型: 1)递归与分治 2)动态规划 3)贪心算法 4)回溯算法 5)图的搜索算法 6)图论 7)数论 8)组合数学 9)分支限界算法 推荐网站:https://vjudge.net/ 下面给出各题型的部分例题。 注:1.题目来源于ZOJ,POJ和HUD; 2.同一个题目可采用多种解法,本帖题目分类不代表最优解法。 1、递归与分治(27) (1)汉诺塔类问题(7) ZOJ...

消磨、时光的博客 634

July 【补题】

A(zoj 3596)   bfs,记忆搜都可以, 按余数来记录状态. B(zoj 3599)   博弈,跳过 C(zoj 3592)   简单dp,题意不好懂 D(zoj 3602)   子树哈希, 对根的左右儿子的哈希值make_pair()一下映射成根的哈希值就行了. E(zoj 3604)   求n个点构成s颗树的方案数.   当s=1时可以利用Prüfer编码 来...

weixin_30381793的博客 118

ACM各题型OJ题目总结

本帖题目类型: 1)递归与分治 2)动态规划 3)贪心算法 4)回溯算法 5)图的搜索算法 6)图论 7)数论 8)组合数学 9)分支限界算法 推荐网站:https://vjudge.net/ 下面给出各题型的部分例题。 注:1.题目来源于ZOJ,POJ和HUD; 2.同一个题目可采用多种解法,本帖题目分类不代表最优解法。 1、递归与分治(27) (1)汉诺塔类问题(7) ZOJ(3):...

渴望变强 2183

ACM刷题路线

转发自(https://blog.csdn.net/Aibiabcheng/article/details/76597297) 本帖题目类型: 1)递归与分治 2)动态规划 3)贪心算法 4)回溯算法 5)图的搜索算法 6)图论 7)数论 8)组合数学 9)分...

越看越喜欢啊 7460

ACM刷题

本文转自https://blog.csdn.net/Aibiabcheng/article/details/76597297 本帖题目类型: 1)递归与分治 2)动态规划 3)贪心算法 4)回溯算法 5)图的搜索算法 6)图论 7)数论 8)组合数学 9)分支限界算法 推荐网站:https://vjudge.net/ 下面给出各题型的部分例题。 注:1.题目来源于ZOJ,POJ和HUD; ...

Nerdant 692

ZOJ

ZOJ题型分类   --------------------------------------------------------------------------------   初学者题: 1001 1037 1048 1049 1051 1067 1

&&&思考中前行~~ 1675

最长单调递增子序列 poj 2544 || HDU 3998

单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列。首先,从定义上明确我们的问题。给定序列a1, a2, …, an,如果存在满足下列条件的子序列 ai1i2im, (其中i1 即称为一个原序列的长度为m的单调递增子序列,那么,现在的问题是我们要找出一个序列的最长的单调递增子序列。 直观上来说,一个序列Sn,它有2n个子序列,枚举所有的子序列,找出其中单调递

1292765944的专栏 2432

HDU 4734

比赛的时候先写了个裸的数位dp T掉了,然后加加剪枝过了

1292765944的专栏 2382

POJ 3666 Making the Grade

这个题要往DP上想(左偏树什么的也不会) 首先要知道这样一个结论:一定存在一个最优解,使得整理后的数组中不存在整理前数组中不存在的数,亦即:对于每个Bi,一定存在j,使得Bi=Aj。 可以这么想,在做调整时,一定是这么做的,先选出连续的三个数abc, 假设a            如果b>=a && b            如果b            如果b>c,则最小的调整可以是

1292765944的专栏 2150
上一篇: zoj 3397
下一篇: HDU 4435
Benzema67
博客等级 码龄15年 120粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值