Acdream 1667 调皮的数一 (ACdreamer java 专场)

【题目链接】:click here~~

【题目大意】:

Problem Description

数一很喜欢跑步~喜欢追逐风的脚步~

但是数一永远改不了贪玩调皮的个性,他在跑步的时候经常跑到别的跑道上。假设数一在跑一条直线跑道,从左往右是1号跑道,2号跑道,3号跑道......如此类推,并且为了让数一同学更自由,总共有无限条跑道!数一需要跑n步才能到达终点,但是正如上面所说的,他每跑一步要么仍然在原跑道,要么蹿到相邻的跑道,当然数一是不会跑到1号跑道之外的,因为这是违背数一原则的!数一,顾名思义,肯定是从1号跑道开始跑步,同样的,最后必须回到1号跑道到达终点。那么请问数一有多少种方案来跑完这n步呢?(两种方案视为不同当且仅当两种方案的某一步所在的跑道不同)

Input

多组数据,每组数据一个整数n(n≤1000)

Output

对于每组数据,输出一个整数,表示满足题意的方案数。

Sample Input

2
3
5

Sample Output

2
4
21

Hint

n=2时,数一可以有1-2-1或者1-1-1两种方案

n=3时,数一可以有1-2-1-1或者1-1-2-1或者1-2-2-1或者1-1-1-1四种方案

【思路】很容易想到每步方案是有前三个状态推过来,即左边跑道,当前跑道,右边跑道,写成dp就是:

  dp[i][j] = dp[i - 1][j + 1].add(dp[i - 1][j].add(dp[i - 1][j - 1]));

DP[i][j]:表示跑到j跑道跑了i步的方案数。

代码:

/*
* this code is made by herongwei
* Problem: 1667
* Verdict: Accepted
* Submission Date: 2015-09-22 19:51:08
* Time: 992MS
* Memory: 240620KB
*/
//package ac0901;

import java.util.*;
import java.io.*;
import java.math.*;

public class Main
{
    public static void main(String args[])
    {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        //int t = cin.nextInt();
        BigInteger dp[][] = new BigInteger[1101][1101];
         for(int i=0; i<1100; ++i)
           {
               for(int j=0; j<1100; ++j)
               {
                   dp[i][j]=BigInteger.ZERO;
               }
               }
        dp[0][0]=BigInteger.ONE;
        int n;
         for(int i=1; i<=1001; ++i)
           {
               for(int j=1; j<=1001; ++j)
               {
                   dp[i][j] = dp[i - 1][j + 1].add(dp[i - 1][j].add(dp[i - 1][j - 1]));
               }
           }
        while(cin.hasNext())
        {
           n=cin.nextInt();
           System.out.println(dp[n+1][1]);
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-22 08:37:28

Acdream 1667 调皮的数一 (ACdreamer java 专场)的相关文章

HDU 2084: 数塔(in Java)

数塔 import java.util.*;class Main{ public static void main(String args[]) { Scanner scanner=new Scanner(System.in); int C=scanner.nextInt(); while(C--!=0) { int N=scanner.nextInt(); int [][]tower=new int[N][N]; for(int i=0;i<N;i++) for(int j=0;j<=i;j

leetCode:twoSum 两数之和 【JAVA实现】

LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:twoSum 两数之和 [JAVA实现] 方法一 使用双重循环两两相加判断是否等于目标值 public List<String> twoSum2(int[] arr, int sum) { if (arr == null || arr.length == 0) { return new ArrayL

LeetCode01 - 两数之和(Java 实现)

LeetCode01 - 两数之和(Java 实现) 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + n

求一个int型整数的两种递减数之和(java)--2015华为机试题

题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况. 最大递减数:所输入整数的所有递减数中值最大的一个. 如: 75345323,递减数有:75,753,53,53,532,32.那么最大的递减数为753. 各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7

ACdream - 1060 递推数(矩阵+循环节)

https://vjudge.net/problem/71677/origin 已知A(0) = 0 , A(1) = 1 , A(n) = 3 * A(n-1) + A(n-2) (n ≥ 2) 求 A(A(A(A(N)))) Mod (1e9 + 7) Input第一行一个整数 T (T ≤ 10000) 代表数据组数 每组数据占一行,一个整数 n (1 ≤ n ≤ 1e12) Output对于每组测试数据输出一个整数.Sample Input412357427870913Sample Ou

ACdream训练赛系列のJava专场

/* * this code is made by mhy12345 * Problem: 1669 * Verdict: Accepted * Submission Date: 2015-04-21 13:39:02 * Time: 140MS * Memory: 23196KB */ import java.util.*; import java.math.*; public class Main { static public void main(String args[]) { Scan

acdream 1060 递推数 (矩阵快速幂+循环节)

链接:click here~~ 题意: 递推数 Problem Description 已知A(0) = 0 , A(1) = 1 , A(n) = 3 * A(n-1) + A(n-2) (n ≥ 2)    求 A(A(A(A(N)))) Mod (1e9 + 7) Input 第一行一个整数 T (T ≤ 10000) 代表数据组数 每组数据占一行,一个整数 n (1 ≤ n ≤ 1e12) Output 对于每组测试数据输出一个整数. Sample Input 4 1 23574 278

算法笔记_049:奇偶数排序(Java)

目录 1 问题描述 2 解决方案 2.1 一头一尾指针往中间扫描法 2.2 一前一后两个指针同时往后扫描法   1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 2 解决方案 2.1 一头一尾指针往中间扫描法  具体代码如下: package com.liuzhen.array_2; public class OddEvenSort { //解法1:一头一尾指针往中间扫描 public void get

leetcode 454. 四数相加 II java

题目: 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 .所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 . 例如: 输入:A = [ 1, 2]B = [-2,-1]C = [-1, 2]D = [ 0, 2] 输出:2 解释:两个元组如