热门标签 | 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.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。 ... [详细]
  • HDU1787欧拉函数之在线算法欧拉函数的介绍:φ函数的值通式:φ(x)x(1-1p1)(1-1p2)(1-1p3)(1-1p4)…..(1-1pn),其中p1,p2…… ... [详细]
  • 从vc6.0转到vs20052008等出现的错误详解(HYD整理)最近开发平台由VC6.0升级至VS2005,需要将原有的项目迁移,特将碰到的问题归纳如下:1消 ... [详细]
  • IwasstudyingfasterIOmethodsforprogrammingproblems,Ifoundoutthismethodofusinggetchar ... [详细]
  • 为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来 ... [详细]
  • 对象内存地址
    主  题 ... [详细]
  • 由CStringW(wchar_t)不能正常打印收集的
    WIN7、VS2010(工程字符集为Unicode):源代码如下:CStringWline;rs是ODBC取得的结果集(有汉字),调试发现line能成功读取line.Form ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 第五周项目一——体验常成员函数(1)
    设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等。在设计中,由于求距离、求对称点等操作对原对象不能造成任何改变,所以,将这些函数设计为常成员函数是合适的,能够避免数据成 ... [详细]
  • 结构体在内存中的对齐规则
    一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一:#include<iostream ... [详细]
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社区 版权所有