HDU 1502 Regular Words DP+高精度
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502
题目大意:找出总的满足条件的字符串数,num(a)=num(b)=num(c)且任何前缀均满足num(a)>=num(b)>=num(c)
解题思路:用dp[i][j][k]表示a取i个,b取j个,c取k个的状态下最多有多少种满足条件的情况,容易推得状态转移方程如下:
dp[i][j][k]=dp[i-1][j][k](i>j时)+dp[i][j-1][k](j>k时)+dp[i][j][k-1](k>0时)
根据该状态转移方程即可输出最后的结果dp[n][n][n]
因为本题的数据结果比较大,所以还需要用到高精度,对不会用java的人就只能手敲一个大数相加了。。。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define scan(a) scanf("%d",&a)
using namespace std;
#define N 61
char dp[N][N][N][],a[];
void init()
{
strcpy(dp[][][],"1\0");
strcpy(dp[][][],"1\0");
strcpy(dp[][][],"0\0");
strcpy(dp[][][],"1\0");
} void add(char *p)
{
int x,l,i,jin=;
l=strlen(a);
int now=;
for(i=;p[i]!='\0';i++)
//从加数开始一位一位访问
{
if(i>=l)
x=p[i]-''+jin;//i超过了a的长度
else
x=p[i]-''+a[i]-''+jin;
if(x>)
{
jin=x/;
x%=;
}
else
jin=;
a[now++]=x+'';
}
while(jin)
{
if(l<=now)
{
a[now++]=(jin%)+'';
jin/=;
}
else
{
x=a[now]-'';
x+=jin;
if(x>)
{
jin=x/;
x%=;
}
else
jin/=;
a[now++]=x+'';
}
}
if(now>l)
a[now]='\0';
} void put(int x)
{
int l=strlen(dp[x][x][x]);
for(int i=l-;i>=;i--)
cout<<dp[x][x][x][i];
cout<<endl<<endl;
} int main()
{
int i,j,k;
int n;
init();
for(i=;i<=;i++)
{
for(j=;j<=i;j++)
{
for(k=;k<=j;k++)
{
a[]='';
a[]='\0';
// cout<<i<<' '<<j<<' '<<k<<endl;
// cout<<dp[i-1][j][k]<<' '<<dp[i][j-1][k]<<' '<<dp[i][j][k-1]<<endl;
if(i>j&&j>=k)
add(dp[i-][j][k]);
if(j>k)
add(dp[i][j-][k]);
if(k>)
add(dp[i][j][k-]);
strcpy(dp[i][j][k],a);
}
}
}
while(~scanf("%d",&n))
{
put(n);
}
return ;
}
HDU 1502 Regular Words DP+高精度的更多相关文章
- hdu 1502 Regular Words_高精度+dp
题意:问按规则排成的串有多少个A(c)>= B(c) >= C(c) 思路:因为写大整数太累,就偷懒了一下直接用java水过 import java.math.BigInteger; im ...
- hdu 1502 Regular Words(DP)
题意: 一个单词X由{A,B,C}三种字母构成. A(X):单词X中A的个数.B(X),C(X)同理. 一个单词X如果是regular word必须满足A(X)=B(X)=C(X)且对于X的任意前缀有 ...
- hdu 1502 Regular Words
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502 思路:给定一个n,分别由n个a,b,c组成的字符串的所有前缀中a的个数大于等于b的个数大于等于c的个 ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- bzoj 1089 [SCOI2003]严格n元树(DP+高精度)
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1250 Solved: 621[Submit][Statu ...
- hdu 2296 aC自动机+dp(得到价值最大的字符串)
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- CF23 E. Tree 树形dp+高精度
题目链接 CF23 E. Tree 题解 CF竟让卡常QAQ dp+高精度 dp[x][j]表示以x为根的子树,x所属的联通块大小为j,的最大乘积(不带j这块 最后f[x]维护以x为根的子树的最大答案 ...
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
随机推荐
- Oracle Application Express (APEX 4.2) 中进行ajax调用
Oracle Application Express 4.2 (APEX 4.2)是一个快捷的web应用开发工具.在开发网页的过程中有时候会用到ajax请求. 建立ajax请求的方式: 1.建立后台的 ...
- Oracle学习第三讲
关联查询 笛卡尔积 指做关联操作的每个表的每一行都和其他表的每一行组合,假设两个表的记录条数分别为x和y,笛卡尔积将返回x*y条记录 例如:select count(*) from emp; sele ...
- tar 解压缩
解压 tar –xvf file.tar //解压 tar包 tar -xzvf file.tar.gz //解压tar.gz tar -xjvf file.tar.bz2 //解压 tar.bz ...
- C#管理异常和错误
C#管理异常和错误 1.try/catch捕捉异常的语句块,其中try{}中是写可能会出错的程序代码,catch{}中是抛出异常的代码:一个try后可以有多个catch. 2.异常采用继承层次结构进行 ...
- OpenCV Tricks[OpenCV 笔记3]
官方例程 事例程序位于opencv-3.1.0/samples/cpp/ 目录下,可以通过编译整个工程,编译所有的Sample Code 显示当前使用的OpenCV版本 CV_VERSION为标识当前 ...
- 一个在线的C++帮助文档网站 转载
http://www.cplusplus.com/ //C++参考 http://www.cppreference.com/wiki/start //C++参考 http ...
- clipboard让复制的文本换行
https://clipboardjs.com/dist/clipboard.min.js 用clipboard实现复制时, 想让复制的文本换行, 有两咱方法: 第一种, HTML实现: <!- ...
- JavaScript Ajax + Promise
AJAX 在现代浏览器上写AJAX主要依靠XMLHttpRequest对象: function success(text) { var textarea = document.getElementBy ...
- PLSQL性能优化技巧
1.理解执行计划1-1.什么是执行计划 oracle数据库在执行sql语句时,oracle的优化器会根据一定的规则确定sql语句的执行路径,以确保sql语句能以最优性能执行.在oracle数据库系统中 ...
- linux 的一些 不常见的指标
1. linux 的理论 最大用户数 2^32 -1 数据来源 linux就是这个范 (没验证) 2. mv 竟然不能修改文件更新时间