NYOJ 1076 计划数(公式 要么 递归)

方案数量

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描写叙述

给出一个N*M的棋盘。左下角坐标是(0。0)。右上角坐标是(N,M),规定每次仅仅能向上或者向右走。问从左下角走到右上角,一共同拥有多少种方案。上图是一个4*3的棋盘。

输入
多组測试数据。

每组输入两个整数N,M(0≤N,M≤30)。

输入0,0时表示结束。不做不论什么处理。

输出
对于每组測试数据,输出相应的方案数。

例子输入
4 3
2 2
0 0
例子输出
35
6

分析:这道题有2种做法。

一、推公式

ans = C(n+m, n)。由于从左下角走到右上角一共要走n+m步。往上要走n步,假设用1表示向上走。用0表示向右走。则相当于给n+m个数进行赋值,当中n个数被赋值为1,求有多少种赋值方法。仅仅需从n+m个数里挑出n个,有C(n+m, n)中挑选办法。

#include <cstdio>

long long get_ans(long long a, long long x) {
    long long ans = 1;
    for(long long i = 1; i <= a; i++)
        ans = ans * (x - i + 1) / i;
    return ans;
}

int main() {
    long long n, m;
    while(~scanf("%lld%lld", &n, &m) && (n + m)) {
        printf("%lld\n", get_ans(n, n + m));
    }
    return 0;
}

二、递推

由于假设要到(n, m)点,要么从(n-1, m)点过来,要么从(n, m-1)点过来。设dp[i][j]表示从(0, 0)到(i, j)有多少种方案,

则dp[i][j] = dp[i-1][j] + dp[i][j-1],最后输出dp[n][m]就是答案。

#include <cstdio>
#include <cstring>

const int N = 32;
long long dp[N][N];

void get_ans() {
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i < 31; i++)
        dp[i][0] = dp[0][i] = 1;
    for(int i = 1; i < 31; i++)
        for(int j = 1; j < 31; j++)
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
}

int main() {
    get_ans();
    int n, m;
    while(~scanf("%d%d", &n, &m) && (n + m)) {
        printf("%lld\n", dp[n][m]);
    }
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-06 07:18:29

NYOJ 1076 计划数(公式 要么 递归)的相关文章

基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用

基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式定义 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用

E - 不容易系列之(4)――考新郎 错排数公式

国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:  首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排; 然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个. 最后,揭开盖头,如果找错了对象就要当众跪搓衣板... 看来做新郎也不是容易的事情... 假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能. Input输入数据的第一行是

NYOJ 1076 方案数量(公式 或 递推)

方案数量 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给出一个N*M的棋盘,左下角坐标是(0,0),右上角坐标是(N,M),规定每次只能向上或者向右走,问从左下角走到右上角,一共有多少种方案.上图是一个4*3的棋盘. 输入 多组测试数据. 每组输入两个整数N,M(0≤N,M≤30). 输入0,0时表示结束,不做任何处理. 输出 对于每组测试数据,输出对应的方案数. 样例输入 4 3 2 2 0 0 样例输出 35 6 分析:这道题有2种做法. 一.推公式 ans

数式计算(递归解法)

1 /** 2 *注:1.有一个bug(以及未知什么bug) 我已知的是: ([email protected])(ps:@为运算符),这种带括号的表达式不能单独的出现,否则异常退出,,但是只要([email protected])@n 3 4 带括号的表达式出现任意+,-,*,/的运算都能进行正常运算(前面 [email protected]([email protected])也不可以)...不知道为什么()表达式后面没有操作时会异常退出. 5 *不知道如何解决.希望感兴趣的人帮帮忙! 6

HDU 5407——CRB and Candies——————【逆元+是素数次方的数+公式】

CRB and Candies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 722    Accepted Submission(s): 361 Problem Description CRB has N different candies. He is going to eat K candies.He wonders how ma

二叉数的非递归遍历

本文借鉴于:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相

NYOJ蛇形填数(二)

蛇形填数(二) 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 跟蛇形填数一样,只是填数要求按照三角形填.注意每组数据之间用空行隔开 输入 第一行有一个N,表示N组测试数据 接下来每组数据包括一个数字X,表示三角形的边长,0< X <1000 输出 输出之后填好之后的图 样例输入 2 5 4 样例输出 1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 1 2 3 4 9

北京赛车八码滚雪球&amp;精准计划之公式技巧

有经验的彩友可以自己看号,一天怎么也能有几次确实感觉十拿九稳的时候,这时候就是你出手的时候,但也不要乱砸,做好计划是根本.不会看号的彩友可以跟别人的追号计划,如果出错了停下来观察一下,固定方法都会有错误周期,有可能会出现连错的,而连错三四次的不要轻易舍弃,错误周期之后就该是稳定期了,你可以不观察号,但你一定要观察计划的情况.正确的做法是观察走式的动向,找到合适的切入点去进行投注,这样相对来讲会稳得多. 热码是从66期连中到83期,7-9码本来就有90%的机会,在加上抓出热门,在从热门找出热码,基

nyoj 458-小光棍数 (471)

458-小光棍数 内存限制:64MB 时间限制:1000ms 特判: No 通过数:6 提交数:6 难度:1 题目描述: 最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数.他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少? 输入描述: 有多组测试数据.第一行一个整数n,表示有n组测试数据.接下来的每行有一个整数m. 输出描述: 输出第m个小光棍数. 样例输