hdu 1276 下沙的沙子有几粒?

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][n]为有m个H,n个D的时候的方法数
则dp[m][n]=dp[m-1][n]+dp[m][n-1];
dp[m-1][n]:当最后一个字母为H的时候,前面m+n-1个字母方法数为dp[m-1][n]
dp[m][n-1]:当最后一个字母为D的时候,前面m+n-1个字母方法数为dp[m][n-1]

CODE

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
#include <deque>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <time.h>
using namespace std;
typedef long long LL;
#define MAXN 20+10
int main()
{
    LL dp[MAXN][MAXN];
    memset(dp,0,sizeof(dp));
    dp[1][1]=1;
    dp[2][1]=2;
    dp[2][2]=2;
    for(int i=1;i<MAXN;i++)
        dp[i][1]=i;
    for(int i=3;i<MAXN;i++)
        for(int j=2;j<=i;j++)
            dp[i][j]=dp[i-1][j] + dp[i][j-1];
    int m,n;
    while(cin >> m >> n)
        cout << dp[m][n] << endl;
    return 0;
}
### HDU OJ 2610 和 2611 题目差异对比 #### 题目背景与描述 HDU OJ 平台上的第2610题和第2611题均属于算法挑战类题目,旨在测试参赛者的编程能力和逻辑思维能力。然而两道题目在具体的要求、输入输出格式以及解法复杂度方面存在显著不同。 对于第2610题《Bone Collector》,这是一个经典的背包问题变种案例[^1]。题目设定为收集骨头,在给定容量下最大化所获得的价值总和。该问题通常通过动态规划方法求解,时间复杂度相对较低,适合初学者理解和掌握基础的优化技巧。 而第2611题《Pick Apples》则涉及到更复杂的图论概念——最短路径寻找。在这个场景中,参与者扮演的角色需要在一个由节点组成的果园地图内移动来采摘苹果,并返回起点位置使得摘得果实数量最多的同时行走距离最小化。此类问题往往借助Dijkstra或Floyd-Warshall等经典算法实现高效处理方案的设计[^2]。 #### 输入输出样例分析 - **2610 Bone Collector** 输入部分提供了若干组数据集,每组包含两个整数n(物品数目)和v(背包体积),随后给出各物品的具体重量wi及其对应价值vi。最终程序需输出能够装载的最大价值。 输出仅限于单个数值表示最佳解决方案下的最高得分情况。 - **2611 Pick Apples** 此处不仅涉及到了边权(即两点间所需消耗的时间/路程),还增加了顶点属性(如某棵树上挂有的果子量)。因此除了常规的邻接矩阵外还需要额外记录这些特殊参数用于辅助计算过程。最后的结果应呈现一条完整的路线列表连同累计收获了多少颗水果的信息一起展示出来。 综上所述,尽管两者都围绕着资源分配展开讨论,但从实际操作层面来看却有着本质区别:前者聚焦于单一维度内的最优组合选取;后者则是多因素综合考量下的全局最优策略制定。 ```cpp // 示例代码片段 - 动态规划解决2610 Bone Collector #include <iostream> using namespace std; int main() { int n, v; cin >> n >> v; vector<int> w(n), val(n); for (auto& i : w) cin >> i; for (auto& j : val) cin >> j; // dp数组初始化... } // 示例代码片段 - 图论算法应用于2611 Pick Apples #include <queue> #define INF 0x3f3f3f3f typedef pair<int,int> PII; vector<vector<PII>> adjList(N); // 存储加权有向图 priority_queue<PII,vector<PII>,greater<PII>> pq; bool vis[N]; memset(vis,false,sizeof(vis)); while(!pq.empty()){ auto [dist,node]=pq.top(); pq.pop(); if(vis[node]) continue; ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值