UVA 10328 Coin Toss【带限制条件的递推dp+计数技巧+高精度用java】

source:

点击打开链接


题意:进行n次掷硬币,求至少有k次连续出现正面的方案数。

思路:此题和之前写过一题极为类似:点击打开链接

均需要用到计数技巧:将至少化为至多之差,然后用递归dp。于是递推关系参照点击打开链接即可,再次特殊之处在于需要用到大数,而大数直接上java!


注:java好久不写又有些生疏了,注意定义时new的用法,加减乘除直接调用方法,标准输入输出cin的定义,用hasNextInt()判断EOF结束标准等等,务必时常写时常回顾!


代码如下:

import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.Scanner;

public class Main 
{
	static int n;
	public static BigInteger f(int u) throws Exception
	{
		BigInteger[][] dp = new BigInteger[105][2];
		if(u>0) dp[0][0]=new BigInteger("1"); else dp[0][0]=new BigInteger("0");
		dp[0][1]=new BigInteger("1");
		for(int i=1;i<n;i++)
	    {
	        dp[i][1]=dp[i-1][0].add(dp[i-1][1]);

	        if(i<u) dp[i][0]=dp[i-1][0].add(dp[i-1][1]);
	        else if(i==u) dp[i][0]=dp[i-1][0].add(dp[i-1][1]).subtract(new BigInteger("1"));
	        else dp[i][0]=dp[i-1][0].add(dp[i-1][1]).subtract(dp[i-u-1][1]);
	    }
		return dp[n-1][0].add(dp[n-1][1]);
	}
	
	public static void main(String[] args)  throws Exception
	{
		// TODO Auto-generated method stub
		
		Scanner cin = new Scanner(new BufferedInputStream(System.in));
		while(cin.hasNextInt())
		{
			n=cin.nextInt();
			int k=cin.nextInt();
			System.out.println(f(n).subtract(f(k-1)));
		}
	}

}

其实还可进一步优化:可以预先算出100以内的所有结果,后面读入询问后直接输出!但这种每次调用方法的方式也不会超时。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值