• 下沙的沙子有几粒?(解题报告)


    Problem Description
    2005年11月份,我们学校参加了ACM/ICPC 亚洲赛区成都站的比赛,在这里,我们获得了历史性的突破,尽管只是一枚铜牌,但获奖那一刻的激动,也许将永远铭刻在我们几个人的心头。借此机会,特向去年为参加ACM亚洲赛而艰苦集训了近半年的各位老队员表示感谢。
    实际上,除了获奖以外,在这次比赛期间还有一件事也让我们记忆深刻。那是比赛当天等待入场的时候,听到某个学校的一个队员在说:“有个学校的英文名很有意思,叫什么Hangzhou Dianzi University”. 哈哈,看来我们学校的英文名起的非常好,非常吸引人呀。
    不过,事情的发展谁也没有料到,随着杭电英文校名的这一次曝光,影响越来越大,很多人开始对杭电英文校名进行研究,不久以后甚至还成立了一个专门的研究机构,叫做“HDU 校名研究会”。并不断有报道说-相-当-多的知名科学家改行,专门对该问题进行研究,学术界称之为“杭电现象”。很多人在国际知名期刊上发表了研究论文,这其中,尤以中国超级女科学家宇春小姐写的一篇研究报告最为著名,报告发表在science上,标题是“杭电为什么这样红?” 文中研究发现:Hangzhou Dianzi University这个校名具有深刻的哲学思想和内涵,她同时提出了一个大胆的猜想:“假定一个字符串由m个H和n个D组成,从左到右扫描该串,如果字符H的累计数总是不小于字符D的累计数,那么,满足条件的字符串总数就恰好和下沙的沙粒一样多。”
    这就是当今著名的“宇春猜想”!
    虽然还没能从数学上证明这个猜想的正确性,但据说美国方面在小布什的亲自干预下,已经用超级计算机验证了在(1<=n<=m<=1000000000000)时都是正确的。my god! 这是一个多么伟大的猜想!虽然我们以前总说,21世纪是属于中国的,可还是没想这一天来的这么早,自豪ing... + 感动ing...
    感动和自豪之余,问题也来了,如果已知m和n的值,请计算下沙的沙粒到底有多少。

    Ps: 
    1. 中国有关方面正在积极行动,着手为宇春小姐申报诺贝尔奖。
    2、“宇春猜想”中提到的H和D组成的字符串现在被学术界成为“杭电串串”(“杭电串串”前不久被一个卖羊肉串的注册了商标,现在我校正在积极联系买断,据说卖方的底价是1000万欧元,绝不打折,看来希望不大,sigh...)
     
    Input
    输入数据包含多个测试实例,每个占一行,由两个整数m和n组成,m和 n 分别表示字符串中H和D的个数。由于我们目前所使用的微机和老美的超级计算机没法比,所以题目给定的数据范围是(1<=n<=m<=20)。
     
    Output
    对于每个测试实例,请输出下沙的沙粒到底有多少,计算规则请参考“宇春猜想”,每个实例的输出占一行。
     
    Sample Input
    1 1
    3 1
     
    Sample Output
    1
    3
     

    题目很有意思,呵呵.

    仔细分析题目,你会发现这是一道简单的dp问题.

    假设这些串由m个H,和n个D所构成,那必然可以拆分成两个子问题.即组成的字符串最后一个字符是H还是D。

    如果是H则,这些串的个数和  m-1个H    和    n   个D构成的串的个数相等.

    如果为D则,这些串的个数和     m个H    和 n-1   个D构成的串的个数相等.

    所以 m个H和n个D 构成的串的个数 =  m-1个H和n个D构成的串的个数  +  m个H和n-1个D构成的串的个数;

    dp的转移方程式为 arr[i][j] = arr[i-1][j] + arr[i][j-1];  // i,j为H,D的数量.


    #include<iostream>

    int main()
    {
    __int64 arr[
    21][21]; //必须使用长整型不然会溢出
    int h,d;
    memset(arr,
    0,sizeof(arr));
    for(int i = 0; i < 21; i++)
    arr[i][
    0] = 1;//只要‘D’的个数为0,‘H’的个数为任意数,都是一种序列 
    for(int i = 1; i < 21; i++)
    for(int j = 1; j < 21; j++)
    {
    if(i < j)
    arr[i][j]
    = 0;//如果H的个数小于D的个数,那一定无法构成一种序列
    else
    arr[i][j]
    = arr[i - 1][j] + arr[i][j - 1];
    }
    while(std::cin>>h>>d)
    {
    std::cout
    <<arr[h][d]<<std::endl;
    }
    return 0;
    }

      

  • 相关阅读:
    Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级 郑州
    NET项目反编译+VS解决方案整理流程 郑州
    iis 目录枚举文件枚举解决方案 郑州
    Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录 郑州
    SqlServer mssql 按月统计所有部门 郑州
    无法获得数据库 'model' 上的排他锁 解决方法 郑州
    Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。 郑州
    谈谈前端怎样布局切图,程序可以方便快捷添加程序 郑州
    各种UIColor颜色的设置
    iOS
  • 原文地址:https://www.cnblogs.com/bourbon/p/2123204.html
Copyright © 2020-2023  润新知