Counting UVA - 10198
题意:
Gustavo数数时总是把1和4搞混,他认为4只是1的另外一种写法。给出一个整数n,Gustavo想知道有多少个数的数字之和恰好为n。例如,当n=2时,有5个数:11、14、41、44、2。
分析:
设dp[n]表示加和为n的组合的个数
那么很明显这些组合中应该含有含1的组合,那么去掉这个1的话就是dp[n-1]的个数加上一个1,同理含2 的话有dp[n-2]个数加上一个2,同理dp[n-3]的个数加上一个3,因为4和1相同所以相当于2倍的dp[n-1]
因此得到递推式
因为数会很大又不能取模所以得用高精度
code:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in) ;
BigInteger dp[];
dp = new BigInteger[1024];
dp[1] = new BigInteger("2");
dp[2] = new BigInteger("5");
dp[3] = new BigInteger("13");
for(int i = 4; i <= 1000; i++) {
dp[i] = dp[i-1].multiply(BigInteger.valueOf(2)).add(dp[i-2]).add(dp[i-3]);
}
int n;
while(in.hasNext()) {
n = in.nextInt();
System.out.println(dp[n]);
}
}
}