zoukankan      html  css  js  c++  java
  • hdu 2563

    统计问题

    Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 833 Accepted Submission(s): 523

    Problem Description
    在一无限大的二维平面中,我们做如下假设:
    1、  每次只能移动一格;
    2、  不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
    3、  走过的格子立即塌陷无法再走第二次;

    求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
     

    Input
    首先给出一个正整数C,表示有C组测试数据
    接下来的C行,每行包含一个整数n (n<=20),表示要走n步。
     

    Output
    请编程输出走n步的不同方案总数;
    每组的输出占一行。
     

    Sample Input
    2
    1
    2
     

    Sample Output
    3
    7
    
    
    挑战思维的一道题
    假设处于第i步,设a[i]表示第i步向上走,b[i]表示第i步向左或右的步数,总步数f[i]=a[i]+b[i]
    假设第i步上走,则其可以是第i-1步向上走再向上走得到即a[i-1],也可以是第 i-1步往左或右走得到(因为向上走没有什么限制)即b[i-1],所以a[i]=a[i-1]+b[i-1];
    假设第i步向左或右走,则可以是第i-1步向上走再往左或右走得到,因为两个方向都可以所以即为2*a[i-1],也可以是
    第i-1步往左之后只能再往左或往右之后只能再往右走得到(只能继续保持原来的方向,所以不能乘以2),b[i]=2*a[i-1]+b[i-1];解这三个方程得f[n]=2*f[n-1]+f[n-2],,,,
    解得时候要有点耐心,也不是很容易一下子看得出来的
    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long  f[21];
    int main()
    {
        int cas,n;
        f[1]=3;f[2]=7;
        for(int i=3;i<=20;i++)
            f[i]=2*f[i-1]+f[i-2];
        cin>>cas;
        while(cas--)
        {
            cin>>n;
            cout<<f[n]<<endl;
        }
        return 0;
    }


  • 相关阅读:
    LeetCode 40. Combination Sum II
    LeetCode 39. Combination Sum
    #Python学习#python虚拟环境——virtualenv
    #阿里云#云服务器部署Django(基础篇)
    驱动调试之打印
    Linux内核源码阅读记录一之分析存储在不同段中的函数调用过程
    uevent机制
    字符设备的另一种写法
    DM9000C网卡驱动程序编写与测试
    网卡驱动程序框架以及虚拟网卡驱动程序的实现
  • 原文地址:https://www.cnblogs.com/smilesundream/p/6642576.html
Copyright © 2011-2022 走看看