传送门

题目大意:

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 + 压位的更多相关文章

  1. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  2. codevs 3119 高精度练习之大整数开根 (各种高精+压位)

    /* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...

  3. 压位加速-poj-2443-Set Operation

    题目链接: http://poj.org/problem?id=2443 题目意思: 有n个集合(n<=1000),每个集合有m个数ai(m<=10000,1=<ai<=100 ...

  4. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. UOJ #314. 【NOI2017】整数 | 线段树 压位

    题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...

  6. 【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 ...

  7. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  8. 【bzoj4942】[Noi2017]整数 压位+线段树

    题目描述 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 $x$ ,一开始为0. 接下来有 $n$ 个操作,每个操作都是以下两种类型中的一种: 1 a b :将 $x$ 加上整数 ...

  9. [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 ...

随机推荐

  1. 软件——protel 的pcb电路图制作

    近期一直在学习PCB板的绘制.

  2. Emgucv 图像操作笔记

    这里记下一些学习过程中的心得和技巧.我用VS2008,C#的平台进行编写. 1.将图片载入PictureBox的方法: Image<Bgr, byte> img = new Image&l ...

  3. RMAN异机复制数据库(相同路径)

    有完整的备份,新的数据库datafile.controfile.logfile所在目录结构和原数据库一样. 创建好adump.bdump.cdump.udump等目录. 1.恢复参数文件. 设置环境变 ...

  4. PythonAdvanced

    PythonAdvanced function 函数 (要多使用函数,方便,少变量,好改错) 函数是可以重复执行的语句块,可以重复使用 作用: 1.用于封装语句块,提高代码的重用性 2.定义用户级别的 ...

  5. GO语言学习(三)GO语言学习API文档

    一:GoLang标准库API文档 https://studygolang.com/pkgdoc

  6. 基于bootstrap的漂亮网站后台管理界面框架汇总

    基于bootstrap的漂亮网站后台管理界面框架汇总 10个最新的 Bootstrap 3 管理模板 这里分享的 10 个模板是从最新的 Bootstrap 3 管理模板集合中挑选出来的,可以帮助你用 ...

  7. php实现变态跳台阶(记忆化递归)

    php实现变态跳台阶(记忆化递归) 一.总结 1.本题思路(分类讨论思路,注意初始值和边界值):第一步如果1,那剩下的就是jumpFloorII($number-1)(下面jumpFloorII以j表 ...

  8. 关于stm32的输入输出

    https://blog.csdn.net/u011556018/article/details/72629082

  9. HOOK钩子教程

    [转载]HOOK钩子教程 http://blog.sina.com.cn/s/blog_675049f701019ka9.html(原贴) 先留着,好好学一学! 原文地址:HOOK钩子教程作者:X_T ...

  10. 如何在hadoop中控制map的个数 分类: A1_HADOOP 2015-03-13 20:53 86人阅读 评论(0) 收藏

    hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map的个数,并不是每次都有效的.原因是mapred.map. ...