HDU 4294 A Famous Equation(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4249
题目大意:给一个a+b=c的表达式,但是a、b、c中部分位的数字丢失,并用?代替,问有多少种方案使得这个表达式成立。
There are three solutions for the first case: 7+10=17, 7+11=18, 7+12=19 There is only one solution for the second case: 11+11=22 Note that 01+21=22 is not a valid solution because extra leading zeros are not allowed.
分析:网上的代码有2种,第一种:
状态dp[len][i][j][k]表示三个数a,b,c的len位上的三个数字i , j, k 。
if((i+j)%10==k) //上一位不进1
dp[len][i][j][k]+=dp[len-1][ii][jj][kk];其中ii+jj==kk||ii+jj+1==kk
if((i+j+1)%10==k) //上一位进1
dp[len][i][j][k]+=dp[len-1][ii][jj][kk];
其中ii+jj>=10&&(ii+jj)%10==kk,ii+jj+1>=0,(ii+jj+1)%10==kk
最后答案是sum(dp[len-1][i][j][k]), (i+j==k||i+j+1==k)
代码如下:
# include<iostream>
# include<cstring>
# include<cstdio>
# include<stack>
# include<algorithm>
# define LL __int64 //如果需要改成long long 的话多么方便
using namespace std; int len1,len2,len3,a[],b[],c[];
LL dp[][][][];
stack<char >st;
LL DP()
{
int i,j,k,l;
memset(dp,,sizeof(dp));
for(i=; i<; i++)
{
if(a[] != - && a[] != i) //枚举该位,如果不是?则必须是给定的数字i,不能枚举其他数
continue;
for(j=; j<; j++)
{
if(b[] != - && b[] != j)
continue;
for(k=; k<; k++)
{
if(c[] != - && c[] != k)
continue;
if((i+j)%==k)
dp[][i][j][k] = ;
}
}
}
for(l=; l<len3; l++) //从和的倒数第2位开始枚举
{
for(i=; i<; i++)
{
if(a[l] != - && a[l] != i)
continue;
if(l==len1- && i==) //首位不能是0
continue;
if(l>=len1 && i!=) //和比加数多余的位,相当于在加数的前面加0
continue;
for(j=; j<; j++)
{
if(b[l] !=- && b[l] !=j)
continue;
if(l==len2- && j==)
continue;
if(l>=len2 && j!=)
continue;
for(k=; k<; k++)
{
if(c[l] != - && c[l] !=k)
continue;
if(l==len3- && k==)
continue;
if((i+j)% !=k &&(i+j+)%!=k) //因为对应位上的三个数字a+b=c或者a+b+1=c;是从前往后进位的
continue;
if((i+j)%==k) //上一位不进1
{
for(int ii=; ii<; ii++)
for(int jj=; jj<; jj++)
for(int kk=; kk<; kk++)
{
if(dp[l-][ii][jj][kk] != &&(ii+jj==kk||ii+jj+==kk))
dp[l][i][j][k] += dp[l-][ii][jj][kk];
}
}
if((i+j+)%==k) //上一位进1
{
for(int ii=; ii<; ii++)ii+jj
for(int jj=; jj<; jj++)
for(int kk=; kk<; kk++)
{
if(dp[l-][ii][jj][kk] != &&(((ii+jj>= && (ii+jj)%==kk))||(ii+jj+>= &&(ii+jj+)%==kk)))
dp[l][i][j][k] += dp[l-][ii][jj][kk];
}
}
}
}
}
}
LL ans = ;
for(i=; i< ; i++)
for(j=; j<; j++)
for(k=; k<; k++)
{
if(dp[len3-][i][j][k] != && (i+j==k || i+j+==k))
ans += dp[len3-][i][j][k];
}
return ans;
}
int main()
{
char s[];
int cas=;
while(~scanf("%s",s))
{
int i,len = strlen(s);
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(c,,sizeof(c));
for(i=; s[i]!='+'; i++)
st.push(s[i]);
len1 = ;
while(!st.empty()) //提取第一个加数,逆序存放到a数组里边,这样进位就是从前往后进位
{
if(st.top() != '?')
a[len1++] = st.top()-'';
else a[len1++] = -;
st.pop();
}
for(i++; s[i] != '='; i++)
st.push(s[i]);
len2 = ;
while(!st.empty()) //提取第2个加数
{
if(st.top() != '?')
b[len2++] = st.top() - '';
else b[len2++] = -;
st.pop();
}
for(i++; i<len; i++)
st.push(s[i]);
len3 = ;
while(!st.empty()) //提取第3个加数
{
if(st.top() != '?')
c[len3++] = st.top() - '';
else c[len3++] = -;
st.pop();
}
printf("Case %d: %I64d\n",cas++,DP());
}
return ;
}
HDU 4294 A Famous Equation(DP)的更多相关文章
- HDU 1864 最大报销额(DP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others) ...
- HDU 2639 Bone Collector II (dp)
题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...
- HDU 4562 守护雅典娜(dp)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- HDU - 6199 gems gems gems (DP)
有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...
- HDU 4249 A Famous Equation(数位DP)
题目链接:点击打开链接 思路:用d[i][a][b][c][is]表示当前到了第i位, 三个数的i位各自是a,b,c, 是否有进位 , 的方法数. 细节參见代码: #include<cstdio ...
- HDU - 6357 Hills And Valleys(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=6357 题意 给一个数值范围为0-9的a数组,可以选择翻转一个区间,问非严格最长上升子序列,以及翻转的区间. 分析 ...
- 2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)
题目链接 题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标.S中所有数按位异或后的值要与T中所有的数按位 ...
- hdu 5623 KK's Number(dp)
问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗104)个数,每次KK都会先拿数.每 ...
- hdu 1978 How many ways(dp)
Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标 ...
随机推荐
- Weka 入门2
现在我们介绍使用Weka来对数据进行分类.对数据进行分类,我们必须先指定那一列作为预测类别.因为数据文件格式的问题,类别一般都是最后一列属性.我们可以使用setClassIndex来设置类别.然后我们 ...
- POJ3254Corn Fields(状压DP)
题意: John 有一个豪华的M*N个格子组成的新牧场 他想种美味的玉米 但是有些位置不能种 而且他种地不选择相邻的格子 求所有可能的种地方法 (不种也算一种选择)输入:第一行M和N, 第二行M*N地 ...
- 使用tomcat的jndi方式连接mysql的字符编码设置
最近新项目使用tomcat中配置jndi连接mysql的方式,在使用过程中发现查询条件为中文的时候查询不出结果,经过一通折腾,发现是jndi在连接数据库的时候忘记设置字符编码. 修改之后的完整配置如下 ...
- js基础一
1.声明提升:变量的声明提升,函数的声明提升,但函数赋值表达式不会提升: foo(); // 正常运行,因为foo在代码运行前已经被创建 function foo() {} foo(); // 出错: ...
- NASA关于如何写出安全代码的10条军规
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:NASA关于如何写出安全代码的10条军规.
- AndroidAnnotations部署
环境: 系统:windows 8 (64bit) 开发工具:Eclipse 3.8 JDK版本:jdk1.6 构建工具:Ant(Eclipse默认的build tool) androidannotat ...
- S2SH商用后台权限系统第一讲
各位博友: 您好!从今天开始我们做一套商用的权限系统.功能包含用户管理.角色管理.模块管理.权限管理.大家知道每个商用系统肯定会拥有一套后台系统,我们所讲的权限系统是整个系统核心部分.本套系统技术有s ...
- FZOJ2110 star(DFS)
Overpower often go to the playground with classmates. They play and chat on the playground. One day, ...
- ubuntu14.04启动提示set_sw_state failed
安装上ubuntu14.04时,系统启动时一直出现一个问题 kernel: [ 16.465893] [drm:rv770_dpm_set_power_state] *ERROR* rv770_set ...
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...