uva10328 Coin Toss(dp)
来源:互联网 发布:标的物 知乎 编辑:程序博客网 时间:2024/06/05 15:33
uva10328
题目
就是说抛硬币正面为H,反面为T,问抛n次的所有可能情况中连续H的个数至少为k的个数。
思路
首先要反一下思路,dp[i][j]记录的是抛i次硬币,连续H的个数不超过j的个数,最后答案就是dp[n][n]-dp[n][k-1],对于dp[i][j]怎么求,首先dp[i][j]=2*dp[i-1][j],相当于强行加上正反面,但是有超过j的情况要排除,如果i-1==j那就减一,不赘述。如果i-1>j,那么我们可以确定的是最后有j个H以及最后j+1是T,不确定的就是1~(i-j-2),而且1~(i-j-2)中H的个数不超过j,所有满足的都要去掉,也就是去掉dp[i-j-2][j],最后就是大数了。
而且循环的时候第二层循环要到n为止,后面的转移会用到。
代码
#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<stack>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;typedef long long ll;const int maxn=110;const int N = 110;int n,k;struct bign{ int len, sex; int s[2000]; bign() { this -> len = 1; this -> sex = 0; memset(s, 0, sizeof(s)); } bign operator = (const char *number) { int begin = 0; len = 0; sex = 1; if (number[begin] == '-') { sex = -1; begin++; } else if (number[begin] == '+') begin++; for (int j = begin; number[j]; j++) s[len++] = number[j] - '0'; } bign operator = (int number) { char string[N]; sprintf(string, "%d", number); *this = string; return *this; } bign (int number) { *this = number; } bign (const char* number) { *this = number; } bign change(bign cur) { bign now; now = cur; for (int i = 0; i < cur.len; i++) now.s[i] = cur.s[cur.len - i - 1]; return now; } void delZore() // 删除前导0. { bign now = change(*this); while (now.s[now.len - 1] == 0 && now.len > 1) { now.len--; } *this = change(now); } void put() // 输出数值。 { delZore(); if (sex < 0 && (len != 1 || s[0] != 0)) cout << "-"; for (int i = 0; i < len; i++) cout << s[i]; } bign operator + (const bign &cur) { bign sum, a, b; sum.len = 0; a = a.change(*this); b = b.change(cur); for (int i = 0, g = 0; g || i < a.len || i < b.len; i++) { int x = g; if (i < a.len) x += a.s[i]; if (i < b.len) x += b.s[i]; sum.s[sum.len++] = x % 10; g = x / 10; } return sum.change(sum); } bign operator - (const bign &cur) { bign sum, a, b; sum.len = len; a = a.change(*this); b = b.change(cur); for (int i = 0; i < b.len; i++) { sum.s[i] = a.s[i] - b.s[i] + sum.s[i]; if (sum.s[i] < 0) { sum.s[i] += 10; sum.s[i + 1]--; } } for (int i = b.len; i < a.len; i++) { sum.s[i] += a.s[i]; if (sum.s[i] < 0) { sum.s[i] += 10; sum.s[i + 1]--; } } return sum.change(sum); }};bign dp[maxn][maxn];int main(){ for(int i=0; i<=100; i++) dp[i][0]=dp[0][i]=1; for(int i=1; i<=100; i++) for(int j=1; j<=100; j++) { dp[i][j]=dp[i-1][j]+dp[i-1][j]; if(i==j+1) dp[i][j]=dp[i][j]-bign(1); else if(i>j+1) dp[i][j]=dp[i][j]-dp[i-j-2][j]; } while(scanf("%d%d",&n,&k)!=EOF) { bign temp=dp[n][n]-dp[n][k-1]; temp.put(); printf("\n"); } return 0;}
0 0
- uva10328 Coin Toss(dp)
- 10328 - Coin Toss (dp 高精度)
- poj_3440 Coin Toss(概率)
- Coin Toss
- uva 10328 - Coin Toss(计数问题)
- poj 3440 Coin Toss(概率)
- 【POJ 3440】 Coin Toss(概率公式)
- POJ3440--Coin Toss
- UVA 10328 Coin Toss
- poj-3440-Coin Toss
- POJ 3440 Coin Toss
- UVA 10328Coin Toss
- POJ_3766_Hexagon Coin Toss
- uva 10328Coin Toss
- Coin Toss(UVA
- [ACM] POJ 3440 Coin Toss (几何概率)
- poj3440--Coin Toss(几何上的概率)
- 【UVa】10328 - Coin Toss(递推 & 对立事件 & java)
- 证书生成 和Tomcat配置
- 【数据结构】树状数组笔记
- 【递推DP】HDU1865-1sting
- Windows下递归搜索文件及其所在目录 .bat脚本实现
- MySQL 服务正在启动。MSQL服务无法启动。服务没有报告任何错误 的解决办法
- uva10328 Coin Toss(dp)
- Mybatis自动生成Xml文件,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题
- 泳道图怎么画?
- div做出一个模糊效果的背景、
- windows下mysql数据库主从复制
- tips
- 基于Ajax的前后端分离
- Android 打开相册选择 照片、音频、视频
- 感知机