算法题:简单的邮递计划 - 递归

描述

暑假来了,简单在家里闲着无聊,便到邮局找了个差事,邮局让他骑车到郊区取送信,郊区呈矩形,有四条东西方向的街道和N(1<=N<=1000)条南北方向的街道。在交区最西北角的那个路口有一个邮局。每天邮政卡车从邮局出发,每个十字路口(包括边界和四个角)经过且只经过一次。现在邮局希望知道邮政货车行驶的路线有几种。

格式

输入格式

一个数值N

输出格式

一行: 对于给出的街道的路径总数

样例1

样例输入1

4

样例输出1

12

样例2

样例输入2

9

样例输出2

1192

限制

1s.


解题思路:

1)参考:http://www.docin.com/p-94253938.html

2)注意:递归的性能优化

3)注意:大整数的处理


解答:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.math.BigInteger;

class Main
{
    static HashMap<Long, BigInteger> routeMap = new HashMap<Long, BigInteger>();
    public static void main(String[] argv)
    {
        try {
            InputStreamReader inputStream = new InputStreamReader(System.in);
            BufferedReader buffer = new BufferedReader(inputStream);

            int n = Integer.parseInt(buffer.readLine());

            System.out.println(getRoute(n));
        } catch (Exception ex) {
            System.out.println("Error:" + ex.getMessage());
        }
    }

    public static BigInteger getRoute(long n)
    {
        if (n == 1) {
            return new BigInteger("0");
        } else if (n == 2) {
            return new BigInteger("2");
        } else if (n == 3){
            return new BigInteger("4");
        } else if (n == 4) {
            return new BigInteger("12");
        } else {
            if (routeMap.containsKey(n)) {
                return routeMap.get(n);
            }
            //BigInteger number = getRoute(n - 4) - getRoute(n - 3) * 2 + getRoute(n - 2) * 2 + getRoute(n - 1) * 2;
            BigInteger number = getRoute(n - 4).subtract(getRoute(n - 3).multiply(new BigInteger("2"))).add(getRoute(n - 2).multiply(new BigInteger("2"))).add(getRoute(n - 1).multiply(new BigInteger("2")));;
            routeMap.put(n, number);
            return number;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/loophome/article/details/79322682