博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1019: [SHOI2008]汉诺塔
阅读量:4328 次
发布时间:2019-06-06

本文共 1642 字,大约阅读时间需要 5 分钟。

可以通过另一个数组 来改变dp的方向

 

/**************************************************************    Problem: 1019    User: lxy8584099    Language: C++    Result: Accepted    Time:0 ms    Memory:852 kb****************************************************************/ /*    普通的汉诺塔 f[i]=2*f[i-1] + 1     但是这个有明确的方向性     我们设 g[x][i]为 x移动i个到g[x][i] 上面             f[x][i] 为x移动i个到g[x][i] 上面     令g[x][i-1]==y  那么最后一个盘子移动到 z=6-x-y;    如果g[y][i-1]==z  正好可以直接移动过去         f[x][i]=f[x][i-1]+1+f[y][i-1]    如果g[y][i-1]==x  最终就一定是全部在y上         因为当i-1全部移动到x上后 不能移动最小的盘子         只能移动位于z上的最大那个盘子到y         f[x][i]=f[x][i-1]+1+f[y][i-1]+1+f[x][i-1]    对于g数组  根据题目给出的优先级初始化 g[i][1] 的情况    之后的g就是在dp转换中更新  没有更新到的就是不合法情况    dp就只能沿着我们更新过g的路线走下去 */#include
#define ll long longusing namespace std;const int N=50;ll f[N][N];int g[N][N],n,u[N],v[N];char str[10];int main(){    scanf("%d",&n);    for(int i=1;i<=6;i++)    {        scanf("%s",str); u[i]=str[0]-'A'+1; v[i]=str[1]-'A'+1;    }    for(int i=6;i>=1;i--) g[u[i]][1]=v[i];     // 倒着循环 前面的可以覆盖后面的     for(int i=1;i<=3;i++) f[i][1]=1;    for(int i=2;i<=n;i++)    {        for(int x=1;x<=3;x++) // 枚举移动哪一个上面的盘子         {            int y=g[x][i-1],z=6-x-y;            if(g[y][i-1]==z)             {                f[x][i]=f[x][i-1]+1+f[y][i-1];                g[x][i]=z; // 全部移动到了 z             }            else if(g[y][i-1]==x)            {                 f[x][i]=f[x][i-1]+1+f[y][i-1]+1+f[x][i-1];                g[x][i]=y; // 全部移动到了 y             }            else continue; // 剩下的就是不合法情况          }    }    printf("%lld\n",f[1][n]);    return 0;}

 

转载于:https://www.cnblogs.com/lxy8584099/p/10166796.html

你可能感兴趣的文章
Sublime Text 配置
查看>>
【杂谈】需要mark的一些东西
查看>>
P2731 骑马修栅栏 欧拉函数
查看>>
sort函数
查看>>
CentOS-6.3安装配置Nginx
查看>>
女陔说"你不懂我", 到底什么意思
查看>>
uva11149
查看>>
S/4HANA中的销售计划管理
查看>>
【图灵学院09】RPC底层通讯原理之Netty线程模型源码分析
查看>>
非常的好的协同过滤入门文章(ZZ)
查看>>
数据结构:哈希表
查看>>
markdown 基本语法
查看>>
tensorflow之tf.slice()
查看>>
Python高阶函数-闭包
查看>>
Windows下安装Redis
查看>>
Ubuntu 12.04 部署 PostGIS 2.1
查看>>
手机web——自适应网页设计(html/css控制)
查看>>
*[codility]CartesianSequence
查看>>
Hadoop1重新格式化HDFS
查看>>
HttpClientUtil工具类
查看>>