Uva10328 dp(递推+高精度)
题目链接:http://vjudge.net/contest/136499#problem/F
题意:给你一个硬币,抛掷n次,问出现连续至少k个正面向上的情况有多少种。
一个比较好理解的题解:原题中问出现连续至少k个H的情况,很难下手。我们可以试着将问题转化一下,设dp[i][j]表示抛掷i个硬币出现连续至多j个H的情况种数。
实际上原题中的出现连续至少k个H,即出现连续k个H,k+1个H,...n个H的并集,等价于dp[n][n]-dp[n][k-1],即从连续至多n个H的情况(其实这就是所有的抛掷情况种数)减去连续至多(k-1)个H的情况,这保证得到的所有情况一定至少有k个连续的H。
现在问题就变成了怎么求dp[i][j]。
考虑当i<=j的时候,dp[i][j]=dp[i-1][j]*2,即从上一阶段得到的抛掷序列后面增加正和反两种情况,如果出现连续的H个数大于j个,这种情况是非法的,但很显然此时不会出现这种情况。
当i>j时,如果继续用dp[i][j]=dp[i-1][j]*2就不行了。因为如果 从i-j到第i-1全部都是H ,那么这时候在第i个位置再加一个H,就会出现连续的H个数大于j个的非法状态,所以我们需要减掉 从i-j到第i-1全部都是H 的这种情况。那么这种情况有多少种呢。我们考虑该状态是如何转移而来的。试想第i-j-1个位置应该是什么呢。很明显应该是F。如果是H那就会出现非法状态了。那在第i-j-1之前的位置呢。无论H和F都可以,只要不出现连续的H个数大于j的非法状态即可,这就是dp[i-j-2][j]。
那么这样,dp[i][j]=dp[i-1][j]*2-dp[i-j-2][j]。
但这还是不够的。我们之前的推导都是基于第i-j-1个位置一定存在的前提下(i>j不能保证第i-j-1个位置一定存在),那如果第i-j-1个位置不存在,第i-j-2个位置也就不存在,上述方程也就不成立了。但这种情况很好想,此时一定是i==j+1,从第1个位置到第j个位置全部都是H,只有这一种情况,所以方程变成dp[i][j]=dp[i-1][j]*2-1。
综上:
dp[i][j]表示抛掷i个硬币出现连续至多j个H的情况种数
dp[0][j]=1
i<=j: dp[i][j]=dp[i-1][j]*2;
i>j :if(i==j+1): dp[i][j]=dp[i-1][j]*2-1;
else: dp[i][j]=dp[i-1][j]*2-dp[i-j-2][j]
ans=dp[n][n]-dp[n][k-1]
需要用到大数。
剩下的就是写代码了,一个高精度乘法,一个高精度减法。
//没办法java还没学 ==
AC代码:
#include<cstdio>
#include<cstring>
using namespace std; const int N=+; void mulsn(char *b,char *a,int k) //乘法 b=a*k
{
int i,l=strlen(a),s=;
for(i=; i<l || s; i++)
{
if(i<l) s+=(a[i]-'')*k;
b[i]=s%+'';
s/=;
}
b[i]=; // '/0'
} void minuss(char *a,char *b) //减法 a-b
{
int i,j,k,la=strlen(a),lb=strlen(b);
for(i=,j=,k=; i<la || j<lb || k; i++,j++)
{
if(i<la) k+=a[i]-'';
if(i<lb) k-=b[j]-'';
if(k<) k+=, a[i+]-=;
a[i]=(k%)+'';
k/=;
}
while(i> && a[i-]=='') i--;
a[i]=;
} char sum[N][N][N];
char ch[]=""; int main()
{ int n,k;
while(scanf("%d%d",&n,&k)==)
{
for(int i=; i<=n; i++)
{
sum[][i][]='';
sum[][i][]=;
}
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
mulsn(sum[i][j],sum[i-][j],);
if(i==j+) minuss(sum[i][j],ch);
else if(i>j) minuss(sum[i][j],sum[i-j-][j]);
}
}
minuss(sum[n][n],sum[n][k-]);
int l=strlen(sum[n][n]);
for(int i=l-; i>=; i--)
printf("%c",sum[n][n][i]);
puts("");
}
return ;
}
Uva10328 dp(递推+高精度)的更多相关文章
- PKU 2506 Tiling(递推+高精度||string应用)
题目大意:原题链接有2×1和2×2两种规格的地板,现要拼2×n的形状,共有多少种情况,首先要做这道题目要先对递推有一定的了解.解题思路:1.假设我们已经铺好了2×(n-1)的情形,则要铺到2×n则只能 ...
- hdu2089(数位DP 递推形式)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 递推+高精度+找规律 UVA 10254 The Priest Mathematician
题目传送门 /* 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子 ...
- [luogu]P1066 2^k进制数[数学][递推][高精度]
[luogu]P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻 ...
- [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1089 分析: 第一感觉可以用一个通式求出来,但是考虑一下很麻烦,不好搞的.很容易发现最 ...
- hdu 2604 Queuing(dp递推)
昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...
- 【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
1002: [FJOI2007]轮状病毒 Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同 ...
- Power oj2498/DP/递推
power oj 2498 /递推 2498: 新年礼物 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 12 Accepted: 3 ...
- BZOJ4321queue2——DP/递推
题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两 人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方案满足沙茶们如此不苛刻的条件. ...
随机推荐
- Greedy:Linear world(POJ 2674)
Linear world 题目大意:一些人生活在线性世界中,到达线性世界两端就会消失,两个人的前进方向有两个,相遇会改变各自相遇方向,求最后一个人掉下的人的名字和时间. 其实这一题就是弹性碰撞的模 ...
- 【工具】 原版完美激活 Flash builder 4.7 【非破解激活】
此方法原理在于激活 FlashBuilder 4.7 而不是破解(靠修改文件,或改变版本号),所以此破解更加稳定! FlashBuilder 4.7 下载地址: 32bit:http://trials ...
- java jsp调用shell(带参数)脚本并返回值
test.jsp <%@ page language="java" import="java.util.List,java.util.ArrayList,java. ...
- 核心动画基础动画(CABasicAnimation)关键帧动画
1.在iOS中核心动画分为几类: 基础动画(CABasicAnimation) 关键帧动画(CAKeyframeAnimation) 动画组(CAAnimationGroup) 转场动画(CATran ...
- [Linux] linux awk命令详解
reference : http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于g ...
- Mac系统下使用VirtualBox虚拟机安装win7--第三步 在虚拟机上安装 Windows 7
第三步 在虚拟机上安装 Windows 7 等待虚拟机进入 Windows 7 的安装界面以后,在语言,货币,键盘输入法这一面,建议保持默认设置,直接点击“下一步”按钮,如图所示
- Lattice Diamond 的学习之新建工程
1).打开软件 在软件打开后的初始布局会有一个Start page 可以创建.打开.导入一个ISPLEVER 工程. 2).建立工程:1,Start page 中Project --> NEW ...
- linux中解决SSH连接慢问题 关键点GSSAPIAuthentication
[root@ok 6FE5-D831]# ssh -v xxx.xxx.xxx.64 OpenSSH_5.3p1, OpenSSL Feb debug1: Reading configuration ...
- 使用Delphi对象(声明、实例化、构造、释放)
一.声明和实例化 在使用一个对象之前,用class关键字声明一个对象.可以在一个程序或单元的type部分声明一个对象类型: type TFooObject = class; 除了声明一个对象类型,通常 ...
- Window Server 2003(IIS6) 安装.net4.0遇到的问题总结
1.Window server 2003系统原本就装了.net1.0..net2.0 ,安装.net 4.0之前,系统已经发不了一些网站,这个时候,我安装.net 4.0返现程序不能访问了,提示ser ...