题目链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1269

10328 - Coin Toss

Time limit: 3.000 seconds
#### 问题描述
> Toss is an important part of any event. When everything becomes equal toss is the ultimate decider.
> Normally a fair coin is used for Toss. A coin has two sides head(H) and tail(T). Superstition may work
> in case of choosing head or tail. If anyone becomes winner choosing head he always wants to choose
> head. Nobody believes that his winning chance is 50-50. However in this problem we will deal with a
> fair coin and n times tossing of such a coin. The result of such a tossing can be represented by a string.
> Such as if 3 times tossing is used then there are possible 8 outcomes.
> HHH HHT HTH HTT THH THT TTH TTT
> As the coin is fair we can consider that the probability of each outcome is also equal. For simplicity
> we can consider that if the same thing is repeated 8 times we can expect to get each possible sequence
> once.
> In the above example we see 1 sequence has 3 consecutive H, 3 sequence has 2 consecutive H and 7
> sequence has at least single H. You have to generalize it. Suppose a coin is tossed n times. And the
> same process is repeated 2n times. How many sequence you will get which contains a sequence of H of
> length at least k.

输入

The input will start with two positive integer, n and k (1 ≤ k ≤ n ≤ 100). Input is terminated by

EOF.

输出

For each test case show the result in a line as specified in the problem statement.

样例输入

4 1

4 2

4 3

4 4

6 2

样例输出

15

8

3

1

43

题意

给你n个硬币,考虑正反的所有排列数:比如n=2:{HH,HT,TH,TT),然后问至少有k个的硬币连续正面朝上的总数。

题解

至少k个=2^n-最多k-1个。

所以我们可以转换成去求最多k个的问题

dp[k][i][0]表示前i个最多k个连续正面朝上,且第i个反面朝上的总数,

dp[k][i][1]表示前i个最多k个连续正面朝上,且第i个反面朝上的总数,

则我们只需要考虑扣掉最后连续k+1个正面朝上这种情况就可以转移了,写完之后上大整数。

代码

c++(没考虑数据溢出):

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=111; LL dp[maxn][maxn][2]; int n,m; void pre(){
clr(dp,0);
for(int k=0;k<maxn;k++){
dp[k][0][0]=1;
for(int i=1;i<maxn;i++){
dp[k][i][1]=dp[k][i][0]=dp[k][i-1][0]+dp[k][i-1][1];
if(i>k) dp[k][i][1]-=dp[k][i-k-1][0];
}
}
} int main() {
pre();
while(scf("%d%d",&n,&m)==2){
LL x=1;
rep(i,0,n) x*=2;
prf("%lld\n",x-dp[m-1][n][0]-dp[m-1][n][1]);
}
return 0;
} //end-----------------------------------------------------------------------

java:

import java.util.*;
import java.math.*; public class Main {
final static int maxn = 111; public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
BigInteger[][][] dp = new BigInteger[maxn][maxn][2]; for (int i = 0; i < maxn; i++) {
for (int j = 0; j < maxn; j++) {
dp[i][j][1]=dp[i][j][0] = BigInteger.ZERO;
}
} for (int k = 0; k < maxn; k++) {
dp[k][0][0] = BigInteger.ONE;
for (int i = 1; i < maxn; i++) {
dp[k][i][1]=dp[k][i][0] = dp[k][i - 1][0].add(dp[k][i - 1][1]); if (i > k)
dp[k][i][1] = dp[k][i][1].subtract(dp[k][i - k - 1][0]);
}
} BigInteger[] x = new BigInteger[maxn];
x[0] = BigInteger.ONE;
for (int i = 1; i < maxn; i++)
x[i] = x[i - 1].add(x[i - 1]); while (cin.hasNext()) {
int n, m;
n = cin.nextInt();
m = cin.nextInt(); BigInteger ans = x[n].subtract(dp[m - 1][n][0]).subtract(dp[m - 1][n][1]); System.out.println(ans.toString()); }
}
}

UVA 10328 - Coin Toss dp+大数的更多相关文章

  1. UVA 10328 Coin Toss

    Coin Toss Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Original ID: ...

  2. uva 10328 - Coin Toss 投硬币(dp递推,大数)

    题意:抛出n次硬币(有顺序),求至少k个以上的连续正面的情况的种数. 思路:转换成求抛n个硬币,至多k-1个连续的情况种数,用所有可能出现的情况种数减去至多k-1个的情况,就得到答案了.此题涉及大数加 ...

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

    https://vjudge.net/problem/UVA-10328 题意: 有H和T两个字符,现在要排成n位的字符串,求至少有k个字符连续的方案数. 思路:这道题目和ZOJ3747是差不多的,具 ...

  4. UVa 10328 - Coin Toss (递推)

    题意:给你一个硬币,抛掷n次,问出现连续至少k个正面向上的情况有多少种. 原题中问出现连续至少k个H的情况,很难下手.我们可以试着将问题转化一下. 设dp[i][j]表示抛掷i个硬币出现连续至多j个H ...

  5. UVA.674 Coin Change (DP 完全背包)

    UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...

  6. UVA 674 Coin Change(dp)

    UVA 674  Coin Change  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/ ...

  7. UVA 674 Coin Change 换硬币 经典dp入门题

    题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数. 经典的dp题...可以递推也可以记忆化搜索... 我个人比较喜欢记忆化搜索,递推不是很熟练. 记忆化搜索:很白 ...

  8. UVA 562 Dividing coins(dp + 01背包)

    Dividing coins It's commonly known that the Dutch have invented copper-wire. Two Dutch men were figh ...

  9. uva 674 Coin Change 换钱币【完全背包】

    题目链接:https://vjudge.net/contest/59424#problem/A 题目大意: 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值 ...

随机推荐

  1. django 登录注册注销

    一.设计数据模型 1.数据库模型设计 作为一个用户登录和注册项目,需要保存的都是各种用户的相关信息.很显然,我们至少需要一张用户表User,在用户表里需要保存下面的信息: 用户名 密码 邮箱地址 性别 ...

  2. Mac下Anaconda的安装和使用

    前提 在刚接触python的时候我想大多数人都会面临一个问题,我到底是选择2还是3,因为现在网上好多的资料和视频项目中都还是用的2,我们跟着学习的时候肯定也是首先从2开始学的,但是我们心里肯定也担心学 ...

  3. win下python环境搭建以及安装pip、django

    1. 安装python并配置 下载安装python,这里我下载的是python2.7,听说2.7比较好用 地址:https://www.python.org/downloads/source/ 记住你 ...

  4. 批处理之 for /f 中的delims和tokens

    0x00 前言 今天在对windows进行提权之前的系统信息收集的时候,需要使用到一条批处理语句把特定部分的内容从一个txt的文本当中提取出来:该条语句是如下: for /f "tokens ...

  5. 【树形DP】洛谷1122_最大子树和

    又是一道树形DP的入门题,思想非常简单  然而我最开始还是存了两个状态[传送门] 题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上 ...

  6. 20170607 JDBC课堂实践 任务四

    20170607 JDBC课堂实践 任务四 题目 查询world数据库,查询哪个国家的平均寿命最长. 码云链接 SQL语句 SELECT Code, Name, LifeExpectancy FROM ...

  7. 20155305《信息安全系统设计基础》10月18日课堂 fork,exic,wait

    20155305<信息安全系统设计基础>10月18日课堂 fork,exic,wait fork()函数 1.fork函数作用 一般来讲, 我们编写1个普通的c程序, 运行这个程序直到程序 ...

  8. Linux下IPC机制

    Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...

  9. 20155331 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155331 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 使用JDK编译.运行简单的java程序 实验目的与要求: 使用JDK和IDE编译.运行简 ...

  10. C#基础之委托

    委托常常和事件在一起使用,可以理解委托是方法的容器,事件则是委托的另一种表现形式.委托和事件虽然写得还比较多,不过也只是用的熟练而已,趁周末没课好好巩固下基础,一点一点积累吧. 1.一个简单的小例子 ...