【Java】【高精度】【递推】UVA - 11375 - Matches

d[i+c[j]]+=d[i](c[j]是拼成j所需的火柴数)

d[0]=1;

别忘了不能有前导零,所以当i为零时,不要尝试去拼成零。反而应该在n>=6时,最后给答案加1(单独拼出0)。

import java.util.*;
import java.io.*;
import java.math.*;

public class Main{
	static BigInteger[] d=new BigInteger[2010];
	static int[] c=new int[]{6,2,5,5,4,5,6,3,7,6};
	public static void main(String[] argc){
		Scanner sc = new Scanner (new BufferedInputStream(System.in));
		while(sc.hasNext()){
			Arrays.fill(d,BigInteger.ZERO);
			int n=sc.nextInt();
			d[0]=BigInteger.ONE;
			for(int i=0;i<=n;++i){
				for(int j=0;j<10;++j){
					if((i!=0 || j!=0) && i+c[j]<=n){
						d[i+c[j]]=d[i+c[j]].add(d[i]);
					}
				}
			}
			BigInteger ans=BigInteger.ZERO;
			for(int i=1;i<=n;++i){
				ans=ans.add(d[i]);
			}
			if(n>=6){
				ans=ans.add(BigInteger.ONE);
			}
			System.out.println(ans);
		}
		sc.close();
    }
}
时间: 2024-10-18 12:51:26

【Java】【高精度】【递推】UVA - 11375 - Matches的相关文章

uva 11375 - Matches(递推)

题目链接:11375 - Matches 题目大意:给出n根火柴,问说能组成多少种数字,要求说0不能打头. 解题思路:d[i]表示i根火柴能够组成的数量,d[i+c[j]] = d[i+c[j]] + d[i]; 最后dp[i]表示小于等于i根火柴能组成的数量,dp[i]=∑jidp[j]. 高精度. #include <cstdio> #include <cstring> #include <iostream> using namespace std; const i

ACdream 1420 High Speed Trains【Java大数高精度 + 递推】

High Speed Trains Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) 链接:http://acdream.info/problem?pid=1420 Problem Description The kingdom of Flatland has n cities. Recently the king of Flatland visited Japan and was a

UVa 10328 Coin Toss(Java大数+递推)

https://vjudge.net/problem/UVA-10328 题意: 有H和T两个字符,现在要排成n位的字符串,求至少有k个字符连续的方案数. 思路:这道题目和ZOJ3747是差不多的,具体做法可以参考另一篇博客http://www.cnblogs.com/zyb993963526/p/7203833.html 但是这道题目的话是要用大数来做的,c++感觉不太好写,就学了下java的做法. 1 import java.math.BigInteger; 2 import java.ut

UVa 11375 Matches

大年夜的写代码果然状态非常之差...感觉特别困,连个高精度都折腾了我好久.还是刘汝佳<训练指南>里的一道例题,解题思路其实也差不多,但是想对书里面的内容再讲讲.其中d[i]是代表i个火柴棒恰好能构成的正整数数目(不包含整数0),然后有点类似于动态规划的做法,通过已知的d[]求出剩下的d[]. 不过仔细想来貌似有点问题.例如已知d[j],那么d[j+num[0]]+=d[j].那么新加的数字0是不是应该也有好几种排列方式呢?例如d[j]中有一个数字123,那么d[j+num[0]]是不是应该有1

[bzoj1002][FJOI2007]轮状病毒-题解[基尔霍夫矩阵][高精度][递推]

Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 Sample Input

POJ 2506 Tiling(高精度+递推)

高精度模版(bin神的) /* * 高精度,支持乘法和加法 */ struct BigInt { const static int mod = 10000; const static int DLEN = 4; int a[600],len; BigInt() { memset(a,0,sizeof(a)); len = 1; } BigInt(int v) { memset(a,0,sizeof(a)); len = 0; do { a[len++] = v%mod; v /= mod; }w

JAVA语法——递推数列

题目描述 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第k个数对10000的模. 输入描述: 输入包括5个整数:a0.a1.p.q.k. 输出描述: 第k个数a(k)对10000的模. 链接:https://www.nowcoder.com/questionTerminal/d0e751eac618463bb6ac447369e4aa25 来源:牛客网 import java.util.*; public class Main { publi

BZOJ 1002 FJOI2007 轮状病毒 递推+高精度

题目大意:轮状病毒基定义如图.求有多少n轮状病毒 这个递推实在是不会--所以我选择了打表找规律 首先执行下面程序 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 110 using namespace std; struct abcd{ int to,next; bool ban; }table[M<<2]; int head[

BZOJ 1002 + SPOJ 104 基尔霍夫矩阵 + 一个递推式。

BZOJ 1002 高精度 + 递推 f[1] = 1; f[2] = 5; f[i] = f[i - 1] * 3 - f[i - 2] + 2; SPOJ 104 裸 + 不用Mod 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 7 using namespace std;