UVA 11375 Matches(递推)

来源:互联网 发布:盛世网络兼职平台官网 编辑:程序博客网 时间:2024/06/06 04:01

题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2370

思路:mat[x]表示数字x所需的火柴数,则当有i根火柴时,每添加一个数字x,就行状态i转移到状态i+mat[x]。令d[i]表示状态i个火柴时的方案数,则每次从状态i到状态i+mat[x]的方案数即为d[i+mat[x]]+=d[i]。答案即为f[1]+f[2]+...+f[n](火柴不必全部使用完)。由于不允许前导零存在,则当火柴数为0时,不允许其组成数字0(最后若火柴数大于6,则最后结果加一,即加上组成0)。

import java.math.BigInteger;import java.util.Scanner;public class Main{static final int maxn=2000+50;public static void main(String[] args){int[] mat={6,2,5,5,4,5,6,3,7,6};BigInteger[] d=new BigInteger[maxn];BigInteger[] f=new BigInteger[maxn];d[0]=BigInteger.ONE;for(int i=1;i<maxn;i++){d[i]=BigInteger.ZERO;f[i]=BigInteger.ZERO;}for(int i=0;i<maxn;i++){for(int j=0;j<10;j++){if(i==0&&j==0) continue;if(i+mat[j]<maxn) d[i+mat[j]]=d[i+mat[j]].add(d[i]);}}for(int i=2;i<maxn;i++) f[i]=f[i-1].add(d[i]);Scanner in=new Scanner(System.in);while(in.hasNext()){int n=in.nextInt();if(n>=6){System.out.println(f[n].add(BigInteger.ONE));}else{System.out.println(f[n]);}}}}



原创粉丝点击