组合数打表法(1587: 爬楼梯)

这道题思路比较清晰,采用的方法是组合数打表法:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1587

(1587: 爬楼梯)

#include <iostream>
#define max 46
using namespace std;

long long c[max][max];
int main()
{
    for(int i = 0;i < max;i++){
        c[i][0]=1;
        c[i][i]=1;
    }
    for(int i = 1;i < max;i++){
        for(int j = 1;j < i;j++){
            c[i][j]=c[i-1][j] + c[i-1][j-1];
        }
    }
    /*
    for(int i = 0;i < max;i++){
        for(int j = 0;j < max;j++){
            cout<<c[i][j]<<" ";
        }
        cout<<endl;
    }
    */
    int t,z;
    cin>>t;
    while(t--){
        cin>>z;
        int m = z/2;
        long long count=0;
        //这个相当于一个排列组合的问题
        for(int i = 0;i <= m;i++)
        {
            count+=c[z-i][i];
        }
        cout<<count<<endl;

    }
    return 0;
}
时间: 2024-10-08 20:50:26

组合数打表法(1587: 爬楼梯)的相关文章

结对合作-乘坐电梯的所有乘客爬楼梯的层数之和最少

组员 石鹤李海超 一.题目 石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停.信1201-1班的张一东觉得在每层都停觉得不耐烦. 由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层.在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层. 问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少. 二.设计思想 算出停在各层需要爬的层数,比较得出最小的. 我也考虑了老师说的优化方法,但我觉得假如2层和4层都满足那种条件,而那个公式没

Climbing Stairs爬楼梯——动态规划

题目描写叙述: 初阶:有n层的台阶,一開始你站在第0层,每次能够爬两层或者一层. 请问爬到第n层有多少种不同的方法? 进阶:假设每次能够爬两层.和倒退一层,同一个位置不能反复走,请问爬到第n层有多少种不同的方法? 解题思路: 初阶:一维动态规划.爬楼梯数目事实上是一个斐波拉契数列. 假定f[i] 表示是爬到第i层的方法,那么f[i] = f[i-1] + f[i-2] //第i层的方法数目等于第i-1层数目加上第i-2层数目. 初值:f[0] = 1, f[1] = 1. //最開始没有爬和第一

【LeetCode-面试算法经典-Java实现】【070-Climbing Stairs(爬楼梯)】

[070-Climbing Stairs(爬楼梯)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 题目大意 你正在爬一个楼梯,要走n步才

一步一步写算法(之爬楼梯)

原文:一步一步写算法(之爬楼梯) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两天上网的时候看到一个特别有意思的题目,在这里和朋友们分享一下: 有一个人准备开始爬楼梯,假设楼梯有n个,这个人只允许一次爬一个楼梯或者一次爬两个楼梯,请问有多少种爬法? 在揭晓答案之前,朋友们可以自己先考虑一下: 这个人爬n层楼梯,那么它也不是一下子就可以爬这么高的,他只有两个选择,要么从n-2层爬过来,要么从n-1层爬过来.除此之外,他没有别的选择.此

LeetCode Climbing Stairs 爬楼梯

递归法(TLE代码): 1 class Solution { 2 public: 3 int climbStairs(int n) { 4 if(n==0) 5 return 1; 6 if(n<0) 7 return 0; 8 return (climbStairs(n-1)+climbStairs(n-2)); 9 } 10 }; 动态规划法: 1 class Solution { 2 public: 3 int climbStairs(int n) { 4 if(n==1) return

[leetcode] 70. 爬楼梯

70. 爬楼梯 最简单的动态规划 假设f[i]表示爬到第i层有几种爬法 那么状态转移方程为:f[i] = f[i-1] + f[i-2] 初始条件显然是:f[1]=1,f[2] = 2; class Solution { public int climbStairs(int n) { if (n == 1) return 1; int f[] = new int[n]; f[0] = 1; f[1] = 2; for (int i = 2; i < n; i++) { f[i] = f[i -

爬楼梯算法

假设一个楼梯有 N 阶台阶,人每次最多可以跨 2 阶,求总共的爬楼梯方案数. 这里使用非递归实现:先不写代码,自己计算当楼梯数为1/2/3/4/5时,对应的爬法有1/2/3/5/8/13/21种.可以发现,随着楼梯数N的增加,爬法总数呈现斐波那契数列规律增加,即f(n) = f(n-1) + f(n-2),知道这个规律后,使用下面的循环即可实现:public class Test {        public static void main(String[] args) {        S

Leetcode -- 爬楼梯(70)

题目描述:假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶? 思路:分为两种情况,最后一步爬1个台阶或者最后一步爬2个台阶,二者之和即为所有的可能的方法.首先想到了递归算法,很不幸的是当n=38时就已经超时了.另外两种方法,斐波拉契数列以及动态规划法. 思路一:动态规划法 初始化dp[0]=0,dp[1]=1.dp[n]=dp[n-1]+dp[n-2] 1 class Solution: 2 def climbStairs(self

mysql分表方法-----MRG_MyISAM引擎分表法

一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解. 首先,我们需要想好到底分多少个表,前提当然是满足应用.这里我使用了一个比较简单的分表方法,就是根据自增id的尾数来分,也就是说分0-9一共10个表,其取值也很好做,就是对10进行取模.另外,还可以根据某一字段的md5值取其中几位进行分表,这样的话,可以分的表就很多了. 好了,先来创建表吧,