HDU 1502 - dp + 压位
题目大意:
3*n的字符串,A、B、C分别有n个,w(X)代表X字母出现的次数,要求该字符串的所有前缀中w(A) >= w(B) >= w(C),问合法方案数有多少。
题目分析:
dp转移较为容易:\(dp[i][j][k] += dp[i - 1][j][k] + dp[i][j - 1][k] + dp[i][j][k - 1] (i >= j >= k)\)。
然而本题真的坑点是答案范围,可以使用字符串存储,算的时候转为int,算完再转回char[],也可以使用压位的方法,新开一维,表示答案的第l个4个数字是多少,输出是要注意中间可能出现要补零的情况。
code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
const int N = 62;
int n, ans[30];
int f[N][N][N][30];
inline void update(int i, int j, int k, int i1, int j1, int k1){
for(int p = 0; p <= 29; p++){
f[i][j][k][p] += f[i1][j1][k1][p];
f[i][j][k][p + 1] += f[i][j][k][p] / 10000;
f[i][j][k][p] %= 10000;
}
}
int main(){
memset(f, 0, sizeof f);
f[0][0][0][0] = 1;
for(int i = 1; i <= 60; i++)
for(int j = 0; j <= i; j++)
for(int k = 0; k <= j; k++){
update(i, j, k, i - 1, j, k);
if(j) update(i, j, k, i, j - 1, k);
if(k) update(i, j, k, i, j, k - 1);
}
bool ff = false;
while(~scanf("%d", &n)){
bool flag = false; int cnt = 0;
for(int i = 29; i >= 0; i--){
if(f[n][n][n][i]){
if(!flag) flag = true, ans[++cnt] = f[n][n][n][i];
else{
int tmp = f[n][n][n][i], tt = 0;
while(tmp) tt++, tmp /= 10;
for(int p = 1; p <= 4 - tt; p++) ans[++cnt] = 0;
ans[++cnt] = f[n][n][n][i];
}
}
else if(flag) ans[++cnt] = 0, ans[++cnt] = 0,ans[++cnt] = 0, ans[++cnt] = 0;
}
for(int i = 1; i <= cnt; i++) printf("%d", ans[i]);
printf("\n\n");
}
}
HDU 1502 - dp + 压位的更多相关文章
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- codevs 3119 高精度练习之大整数开根 (各种高精+压位)
/* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...
- 压位加速-poj-2443-Set Operation
题目链接: http://poj.org/problem?id=2443 题目意思: 有n个集合(n<=1000),每个集合有m个数ai(m<=10000,1=<ai<=100 ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- UOJ #314. 【NOI2017】整数 | 线段树 压位
题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...
- 【NOI】2017 整数(BZOJ 4942,LOJ2302) 压位+线段树
[题目]#2302. 「NOI2017」整数 [题意]有一个整数x,一开始为0.n次操作,加上a*2^b,或询问2^k位是0或1.\(n \leq 10^6,|a| \leq 10^9,0 \leq ...
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
- 【bzoj4942】[Noi2017]整数 压位+线段树
题目描述 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 $x$ ,一开始为0. 接下来有 $n$ 个操作,每个操作都是以下两种类型中的一种: 1 a b :将 $x$ 加上整数 ...
- [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))
5109: [CodePlus 2017]大吉大利,晚上吃鸡! Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 107 Solved: 57[Sub ...
随机推荐
- Python3的取余操作
https://blog.csdn.net/u014647208/article/details/53368244 取余代码: 输入以下代码: >>>10%2 >>> ...
- uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)
题目链接:uva 1463 - Largest Empty Circle on a Segment 二分半径,对于每一个半径,用三分求出线段到线段的最短距离,依据最短距离能够确定当前R下每条线段在[0 ...
- 【CS Round #48 (Div. 2 only)】Water Volume
[链接]h在这里写链接 [题意] 在这里写题意 [题解] 枚举0在哪个位置就好. [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> us ...
- bootstrap课程6 bootstrap的表单注意事项有哪些
bootstrap课程6 bootstrap的表单注意事项有哪些 一.总结 一句话总结: 1.bootstrap中的表单中的每一项是什么样的形式? div.form-group>label +i ...
- 【BZOJ 3998】弦论
[链接]h在这里写链接 [题意] 给你一个长度为n的子串; 让你求出第k小的子串是什么; 输出答案的类型分两种; 第一种,重复的算两次,第二种,重复的算一次. ...
- [AngularFire2] Pagination
Let's see how to do pagination in Firebase: For the init loading, we only want 3 items: findLessonsK ...
- 用bootstrap做一个背景可轮转的登录界面
用bootstrap做一个背景可轮转的登录界面 一.总结 一句话总结:用css3的动画的 @keyframes 规则,制作轮转图. 1.用bootstrap做一个背景可轮转的登录界面? a.动画部分用 ...
- Android Studio SVN使用和VisualSVN-Server配置(图解)
转载请标明出处: http://blog.csdn.net/zq2114522/article/details/51078544: 本文出自:[梁大盛的博客] Android Studio SVN使用 ...
- [Angular2 Form] Validation message for Reactive form
<div class="form-field"> <label>Confirm Password: </label> <input typ ...
- URL validation failed. The error could have been caused through the use of the browser's navigation
URL validation failed. The error could have been caused through the use of the browser's navigation ...