目前做过的最纠结的一道递推题。

情况比较多,比较复杂。。。

这题最主要的还是要推出当m=2 时和m>2时,用什么方法最优。

给个数据

n=3,m=2   需要48

n=3,m=3 需要81

如果在纸上把这两种情况推出来,这题就容易找到递推。

m=1,就是最基础的汉诺塔递推了。

很O_O的汉诺塔

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 561    Accepted Submission(s): 67

Problem Description
O_O汉诺塔包含n种不同大小盘,每种大小m个; 要求每次仅移动一个盘,不允许一个较大的盘放在较小盘上。 并且要求最后排列所有相等大小盘按原来从上到下次序,并且只能按规定的方向搬运,如图(比如A直接搬运到C是不允许的!). 求已知n,m的情况下 从A搬运到C所有盘所用的最少次数。

Input
每行输入n和m两个整数 0<n<1000,0<m<100;
Output
每行输出对应解,为避免高精度将结果对20090308取模.
Sample Input
1 3 2 4
Sample Output
6 28
Source
ECJTU 2009 Spring Contest
//
//  main.cpp
//  hdu2587
//
//  Created by 陈加寿 on 16/3/17.
//  Copyright © 2016年 chenhuan001. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1100
#define MOD 20090308long long dp[N][2];//来一个统计,每个小块被搬多少次
long long save[N][N][2];
long long m;
int tn;
int g[N];long long dfs(int n,int flag)
{if(dp[n][flag]!=-1) return dp[n][flag];if(flag == 1){dp[n][flag] = (2*dfs(n-1,1)+2*m+dfs(n-1,0))%MOD;save[n][n][flag]=2;if(n== tn){for(int i=1;i<=n-1;i++){save[n][i][flag]+=save[n-1][i][1]+save[n-1][i][0];save[n][i][flag]%=2;}}else{for(int i=1;i<=n-1;i++){save[n][i][flag]+=2*save[n-1][i][1]+save[n-1][i][0];save[n][i][flag]%=2;}}}else{dp[n][flag] = (2*dfs(n-1,1)+m)%MOD;save[n][n][flag] = 1;for(int i=1;i<=n-1;i++){save[n][i][flag] += 2*save[n-1][i][1];save[n][i][flag]%=2;}}return dp[n][flag];
}int main() {int n;while(cin>>n>>m){tn = n;//来测试一种方法。!memset(save,0,sizeof(save));memset(g,0,sizeof(g));memset(dp,-1,sizeof(dp));dp[1][0] = m;save[1][1][0] = 1;dp[1][1] = 2*m;save[1][1][1] = 2;dfs(n,1);//对于nif(m>2){if(n<=2){cout<<dp[n][1]<<endl;}else{cout<<(dp[n][1]+2*(dp[n-2][1]+dp[n-2][0]))%MOD<<endl;//进行一次调整。
            }}else if(m==2){//m == 2时if(n<=2){cout<<dp[n][1]<<endl;}else{//int cnt=1;//cout<<(dp[n][1]+2*(dp[n-2][1]+dp[n-2][0])-3*m*(n-2) )%MOD<<endl;//进行一次调整。//各种不对。long long tans=0;for(int i=n;i>1;i--){//把第i个块,从A放入C中//第一步判断是否需要调整if(g[i] == 1){tans = (tans + dp[i-1][0] + dp[i-1][1])%MOD;//调整for(int j=1;j<i;j++){g[j] += save[i-1][j][0]+save[i-1][j][1];g[j]%=2;}}tans = (tans + dp[i-1][0] + dp[i-1][1]+2*m)%MOD;for(int j=1;j<i;j++){g[j] += save[i-1][j][0]+save[i-1][j][1];g[j]%=2;}}cout<<(tans+4)%MOD<<endl;//这样既然是对的,那么上面也是对的
            }}else// m == 1
        {cout<<dp[n][1]<<endl;}
//        for(int i=1;i<=n-2;i++)
//            save[n][i][1] += 2*save[n-2][i][0]+2*save[n-2][i][1];
//
//        for(int i=1;i<=n;i++)
//            cout<<i<<" "<<save[n][i][1]<<endl;
    }return 0;
}

hdu2587(递推)相关推荐

  1. P1541 乌龟棋 题解(洛谷,动态规划递推)

    题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ...

  2. 基础算法整理(1)——递归与递推

    程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一 ...

  3. hdu 5366 简单递推

    记f[i]为在长度是i的格子上面至少放一个木桩的方法数.考虑第i个格子,有放和不放两种情况. 1.如果第i个格子放了一个木桩,则i - 1和i - 2格子上面不能放木桩,方案数为:f[i - 3] + ...

  4. 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Station ...

  5. 2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)

    整理的算法模板合集: ACM模板 题目传送门 三段题面,只有第三段是有用的-前两段又长单词又难懂,就是在讲故事...不过针对四种情况给出四个图帮助我们理解题意是真的赞,可能出题人怕我们看不懂吧(第一句 ...

  6. P6134 [JSOI2015]最小表示(拓扑排序递推 + bitset优化,可达性统计变种)

    整理的算法模板合集: ACM模板 P6134 [JSOI2015] 题目要求删除一条边整个图的连通性是不受影响的,也就是说如果我们要删除边(x,y)(x,y)(x,y),删除以后整个图的连通性不受影响 ...

  7. 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

    本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...

  8. 解题报告:luogu P2272 [ZJOI2007]最大半连通子图(tarjan缩点、递推DP、hash、set判重)

    这时yxc上课时讲解的截图. 一般用到tarjan算法的题目步骤都非常相似: tarjan算法 缩点,建图(这里要判重) 按照拓扑序递推(这里缩点以后逆向就已经是拓扑序了)/ 循环遍历新图求解答案. ...

  9. 0x02.基本算法 — 递推与递归

    目录 一.递推与递归 二.分治 三.模拟计算机实现递归 四.相应习题: 0.AcWing 92. 递归实现指数型枚举(递归/循环+位运算) 1.AcWing 93. 递归实现组合型枚举 2.AcWin ...

最新文章

  1. 平均 14926 元!2021 年 5 月程序员工资统计出炉
  2. mac下server开发环境配置
  3. 36、JAVA_WEB开发基础之监听器
  4. SpringBoot vue图片上传不能立即回显问题解决
  5. hnu 暑期实训之魔咒词典
  6. 如何在 Mac 中更改文件夹图标,换上喜欢的图像 Icon?
  7. Cinema 4D Mac(C4D)常用快捷键与自定义快捷键
  8. openproj ubuntu安装及其输入中文变方块乱码解决
  9. 统计报表可视化html,用统计图让数据可视化
  10. paypal android sdk,Android Paypal SDK错误:商家不接受此类付款
  11. 第48次《中国互联网络发展状况统计报告》发布--报告解读
  12. Stata | 时间序列操作
  13. python降序_Python中numpy如何进行降序?
  14. 2019年云化国际发展趋势_2019年3种令人惊讶的云趋势-您首先在这里听到了
  15. 计算机专业该如何学习:大一篇
  16. 360个人图书馆防复制
  17. js一数组按照另一数组进行排序
  18. 功率放大器驱动容性负载、感性负载,有哪些注意事项?
  19. Linux ps命令和pstree命令
  20. Linux Bash常用的脚本工具整理

热门文章

  1. java http 返回json_java发起http请求获取返回的Json对象方法
  2. 未能加载文件或程序集mysql.web.v20__关于MySQL Server影响ASP.NET网站使用的问题:未能加载文件或程序集MySql.Web.v20...
  3. 路由器性能测试工具_小米路由器AX3600与AX1800 MESH 实测
  4. python 正则表达式匹配的位置_python正则表达式匹配 模式匹配
  5. 大一计算机应用的实验报告,大一《计算机应用基础》实验报告1.doc
  6. c++语言中如果调用函数时,需要改变实参或者返回多个值,应该采取,C++综合练习题2...
  7. python 二维列表从小到大_给Python开发者准备的110道面试题
  8. vs code没有代码提示
  9. 【Tyvj3500】【BZOJ1031】字符加密,后缀数组
  10. 【BZOJ4247】挂饰,又一个奇特的背包