描述
暑假来了,简单在家里闲着无聊,便到邮局找了个差事,邮局让他骑车到郊区取送信,郊区呈矩形,有四条东西方向的街道和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; } } }