热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ1189钉子和小球(DP)

原题是中文的,直接上链接。本文尤其注意(1<<N)这种写法,现在的编译器默认把1视为32位int(Google到这篇文章),而这道题目的金字塔最大可以达到50层,毫无疑问1

原题是中文的,直接上链接。

本文尤其注意(1<

分析金字塔每一层,从第0层到第N层看作一个组合展开式,如从第0层到第5层:

1
1  2  1
1  3  3  1
1  4  6  4  6
1  5  10 10 5  1
1  6  15 20 15 6 1

dp[i][j]表示第i层第j个数的值。规律是:每一个数 = 头上那个数+头上那个数的左边那个数。而有没有钉子会影响它的算法,每一个数处一个钉子,当有钉子时这个数会分成两份分别贡献给下一层的左右两个数,没有钉子时候全部贡献给下下层的一个数,具体见程序。

每一个格子的概率为格子里的数num/(1<

另外,约分的求法用辗转相除法求得最大公约数,之后分子分母同时除以这个最大公约数即可。我的代码如下:

   1: #include 
   2: #include 
   3: using namespace std;
   4: const int LEVEL_SIZE = 51;
   5:  
   6: unsigned long long euclid(unsigned long long a, unsigned long long b)
   7: {
   8:     if (a 
    
   
   9:     {
  10:         unsigned long long temp = a;
  11:         a = b;
  12:         b = temp;
  13:     }
  14:     while(b)
  15:     {
  16:         unsigned long long temp = a % b;
  17:         a = b;
  18:         b = temp;
  19:     }
  20:     return a;
  21: }
  22:  
  23: int main()
  24: {
  25:     bool hasNail[LEVEL_SIZE][LEVEL_SIZE];
  26:     unsigned long long dp[LEVEL_SIZE][LEVEL_SIZE];
  27:     int level=0, m=0;
  28:     cin >> level >> m;
  29:     if (level<2 || level>50 || m<0 || m>level)
  30:         return -1;
  31:     memset(hasNail, false, sizeof(hasNail));
  32:     memset(dp, 0, sizeof(dp));
  33:     
  34:     dp[0][0] = 1;
  35:     char c;
  36:     cin >> c;
  37:     if (c=='*')    
  38:     {
  39:         hasNail[0][0] = true;
  40:         dp[1][0] = dp[1][1] = 1;
  41:     }
  42:     for (int i=2; i<=level; i++)
  43:     {
  44:         for (int j=0; j 
    
   
  45:         {
  46:             cin >> c;
  47:             if (c=='*')    hasNail[i-1][j] = true;
  48:         }
  49:         if (hasNail[i-1][0])
  50:             dp[i][0] += dp[i-1][0];
  51:         for (int j=1; j<=i; j++)
  52:         {    
  53:             if (hasNail[i-1][j-1])    dp[i][j] += dp[i-1][j-1];
  54:             if (hasNail[i-1][j])    dp[i][j] += dp[i-1][j];
  55:             if (!hasNail[i-2][j-1])
  56:                 dp[i][j] += (dp[i-2][j-1]<<2);
  57:         }
  58:     }
  59:  
  60:     if (dp[level][m]==0)
  61:         cout <<"0/" <<((unsigned long long)1< 
    
   
  62:     else
  63:     {
  64:         unsigned long long numerator = dp[level][m];
  65:         unsigned long long denominator=((unsigned long long)1< 
    
   
  66:         unsigned long long temp = euclid(numerator, denominator);
  67:         cout <'/' < 
    
   
  68:     }
  69:     return 0;
  70: }

推荐阅读
  • 第3章 感受(一)——3.1. Hello world 经典版
    [回到目录]白话C++第3章.感受Helloworld!,HelloC++,我们来了!3.1.Helloworld经典版毫无疑义,一 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 题目:poj2342Anniversaryparty题意:话说一个公司的一些然要去参加一个party,每个人有一个愉悦值,而如果某个人的直接上司在场的话会非常扫兴,所以避免这样 ... [详细]
  • 名字空间是为了防止名字污染在标准C++中引入的。它可以将其中定义的名字隐藏起来,不同的名字空间中可以有相同的名字而互不干扰,使用时用域操作符(::)来引用。namespace名字{ ... [详细]
  • 下面想跟大家分享一下,请大家看下面一个例子,看看结果是什么?#include<iostream>usingnamespacestd;intmain() ... [详细]
  • 如何解决《使用std::ostream作为打印函数的参数》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《将流绑定到自身》经验,为你挑选了1个好方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • CC++如何复制 ... [详细]
  • 游船出租TimeLimit:10001000MS(JavaOthers)MemoryLimit:3276832768K(JavaOthers)To ... [详细]
  • 解开一个困扰自己多时的小问题——从std::cout和endl说起
    解开一个困扰自己多时的小问题小序今天上班的时候问了一起工作的Sidney同学一个小问题,显然他是研究过了的,不过他当时没有给出我答案。这个问题着实困扰了我好长时间捏~~晚上吃的小葱蘸 ... [详细]
author-avatar
玫瑰花开-内蒙_238
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有