题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044
最开始想到的做法,每次+1或+2,直到加到目的数为止
import java.util.Scanner;
public class T_2044 {
static int begin,end;
static int solutionCount=0;
/**
* @param args
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int count = input.nextInt();
for (int i = 0; i < count; i++) {
solutionCount=0;
begin = input.nextInt();
end = input.nextInt();
deal();
System.out.println(solutionCount);
}
}
/**
* 每次可以+1 或+2
*/
static void deal(){
if (begin==end) {
solutionCount++;
}
if (begin>=end) {
return;
}
begin+=1;
deal();
begin-=1;
begin+=2;
deal();
begin-=2;
}
}
很不幸,ACM没有通过,原因是超时,这也是递归最大的缺陷。
本人算法一般,并没有找到另外的递归出口,但是在研究结果的时候发现,根据两个数相差的不同,答案有一定规律。
当两数相差1,2,3,4,5, 6, 7 ...
计算结果为1,1,2,8,5,13,21...
即结果有规律,前两项和是第三项的值,所以本题可以先将50个结果全部求出,再根据输入来选择输出结果即可。
注意:需要使用大数。
修改后代码:
import java.math.BigInteger;
import java.util.Scanner;
public class T_2044 {
static int begin,end;
/**
* @param args
*/
public static void main(String[] args) {
//50个结果
BigInteger[] tmp = new BigInteger[50];
//初始化第一个和第二个结果
tmp[1]=BigInteger.ONE;
tmp[2]=new BigInteger("2");
//根据规律计算后面的结果
for (int i = 3; i <tmp.length; i++) {
tmp[i]=new BigInteger(tmp[i-1].add(tmp[i-2]).toString());
}
//根据输入 输出结果即可
Scanner input = new Scanner(System.in);
int count = input.nextInt();
for (int i = 0; i < count; i++) {
begin = input.nextInt();
end = input.nextInt();
System.out.println(tmp[end-begin]);
}
}
}