• 串字符串下沙的沙粒


    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--串字符串

        

    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

        13

        假设这些串由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<stdio.h>
    #include<string.h>
    int main()
    {
        __int64 i,j,f[21][21],n,m;
        memset(f,0,sizeof(f));
    
        for(i=0;i<=20;i++)//没有D时,只有H,只有一种排法
        f[i][0]=1;
    
       for(i=1;i<=20;i++)
         for(j=1;j<=i;j++)
        {
            
            f[i][j]=f[i-1][j]+f[i][j-1];
    
        }
        while(scanf("%I64d%I64d",&n,&m)==2)
        {
            printf("%I64d\n",f[n][m]);
        }
        return 0;
    }

        

    文章结束给大家分享下程序员的一些笑话语录: 神灯新篇
    一个程序员在海滩上发现了一盏神灯。他在灯上擦了几下,一个妖怪就从灯里跳出来说:“我是世界上法术最强的妖怪。我可以实现你的任何梦想,但现在,我只能满足你一个愿望。”程序员摊开了一幅中东地图说:“我想让中东得到永久的和平。”妖怪答道:“哦,我没办法。自打创世纪以来,那里的战火就没有停息过。这世上几乎没有我办不到的事,但这件事除外。”程序员于是说:“好吧,我是一个程序员,为许多用户编写过程序。你能让他们把需求表述得更清楚些,并且让我们的软件项目有那么一两次按进度按成本完成吗?”妖怪说:“唔,我们还是来看中东地图吧。”

  • 相关阅读:
    数据库设计主键定义思考
    dotnet(C#)的面试题,大家共享一下
    一些有创意的SQL语句
    asp.net(c#) 服务器探针
    存储过程共有三种返回值
    如何删除表中的重复记录?等等常用SQL语句的积累
    一般存储过程示例
    关于utf8,unicode字符集
    在Asp.net里利用DIV层元素弹出窗体
    数据库主键设计思考
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3087416.html
Copyright © 2020-2023  润新知