热门标签 | 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经典版毫无疑义,一 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来 ... [详细]
  • 对象内存地址
    主  题 ... [详细]
  • 由CStringW(wchar_t)不能正常打印收集的
    WIN7、VS2010(工程字符集为Unicode):源代码如下:CStringWline;rs是ODBC取得的结果集(有汉字),调试发现line能成功读取line.Form ... [详细]
  • 题目:poj2342Anniversaryparty题意:话说一个公司的一些然要去参加一个party,每个人有一个愉悦值,而如果某个人的直接上司在场的话会非常扫兴,所以避免这样 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 结构体在内存中的对齐规则
    一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一:#include<iostream ... [详细]
  • 要求:海伦公式:ssqrt(p*(p-a)*(p-b*)(p-c)),其中p(a+b+c)2,a,b,c为三角形的三个边。定义两个带参数的宏,一个用来求p,另一个用来求s题目分 ... [详细]
  • Here是指向最小代码的链接,如果消失了, ... [详细]
  • 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社区 版权所有