Problem Description
Mr. B writes an addition equation such as 123+321=444 on the blackboard after class. Mr. G removes some of the digits and makes it look like “1?3+??1=44?”. Here “?” denotes removed digits. After Mr. B realizes some digits are missing, he wants to recover them.
Unfortunately, there may be more than one way to complete the equation. For example “1?3+??1=44?” can be completed to “123+321=444” , “143+301=444” and many other possible solutions. Your job is to determine the number of different possible solutions.
 
Input
Each test case describes a single line with an equation like a+b=c which contains exactly one plus sign “+” and one equal sign “=” with some question mark “?” represent missing digits. You may assume a, b and c are non-negative integers, and the length of each
number is no more than 9. In the other words, the equation will contain three integers less than 1,000,000,000.
 
Output
For each test case, display a single line with its case number and the number of possible solutions to recover the equation.
 
Sample Input
7+1?=1?
? 1+?1=22
 
Sample Output
Case 1: 3
Case 2: 1
Hint
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.
 
Source
 

思路:dp[i][0]表示从右往左第i位不进位的方法数,dp[i][1]表示进位的方法数。

坑点:①long long。

②前导零。③1+1=2这样的情况结果为1。加特判还WA了。④细节。


代码写得太挫,还是贴上来吧。


#include<stdio.h>
#include<string.h> char a[50],b[50],c[50],s[100];
long long dp[10][2]; int main()
{
int la,lb,lc,i,j,k,now,p,q,jp,jq,cas=1; while(~scanf("%s",s))
{
for(i=0;s[i];i++) if(s[i]=='+' || s[i]=='=') s[i]=' '; sscanf(s,"%s%s%s",a,b,c); la=strlen(a)-1;
lb=strlen(b)-1;
lc=strlen(c)-1; dp[0][0]=1;
dp[0][1]=0; now=1; while(la>=0 || lb>=0 || lc>=0)
{
p=q=jp=jq=0; if(la>=0 && a[la]=='? ')
{
for(i=0;i<=9;i++)
{
if(!la && now>1 && !i) continue; if(lb>=0 && b[lb]=='?')
{
for(j=0;j<=9;j++)
{
if(!lb && now>1 && !j) continue; if(lc>=0 && c[lc]=='?')
{
for(k=0;k<=9;k++)
{
if(!lc && now>1 && !k) continue; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
else
{
if(lc>=0) k=c[lc]-'0';
else k=0; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
}
else
{
if(lb>=0) j=b[lb]-'0';
else j=0; if(lc>=0 && c[lc]=='?')
{
for(k=0;k<=9;k++)
{
if(!lc && now>1 && !k) continue; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
else
{
if(lc>=0) k=c[lc]-'0';
else k=0; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
}
}
else
{
if(la>=0) i=a[la]-'0';
else i=0; if(lb>=0 && b[lb]=='?')
{
for(j=0;j<=9;j++)
{
if(!lb && now>1 && !j) continue; if(lc>=0 && c[lc]=='?')
{
for(k=0;k<=9;k++)
{
if(!lc && now>1 && !k) continue; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
else
{
if(lc>=0) k=c[lc]-'0';
else k=0; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
}
else
{
if(lb>=0) j=b[lb]-'0';
else j=0; if(lc>=0 && c[lc]=='?')
{
for(k=0;k<=9;k++)
{
if(!lc && now>1 && !k) continue; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
else
{
if(lc>=0) k=c[lc]-'0';
else k=0; if(i+j==k) p++;
if(i+j==k-1) jp++;
if(i+j-10==k) q++;
if(i+j-10==k-1) jq++;
}
}
} dp[now][0]=dp[now-1][0]*p+dp[now-1][1]*jp;
dp[now][1]=dp[now-1][0]*q+dp[now-1][1]*jq; now++; la--;
lb--;
lc--;
} printf("Case %d: %I64d\n",cas++,dp[now-1][0]);
}
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU-4249-A Famous Equation(DP)的更多相关文章

  1. HDOJ 4249 A Famous Equation DP

    DP: DP[len][k][i][j] 再第len位,第一个数len位为i,第二个数len位为j,和的第len位为k 每一位能够从后面一位转移过来,能够进位也能够不进位 A Famous Equat ...

  2. HDU 4249 A Famous Equation(数位DP)

    题目链接:点击打开链接 思路:用d[i][a][b][c][is]表示当前到了第i位, 三个数的i位各自是a,b,c, 是否有进位 , 的方法数. 细节參见代码: #include<cstdio ...

  3. HDU 4294 A Famous Equation(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4249 题目大意:给一个a+b=c的表达式,但是a.b.c中部分位的数字丢失,并用?代替,问有多少种方案 ...

  4. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  5. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  6. hdu 2829 Lawrence(斜率优化DP)

    题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...

  7. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  8. HDU 1231.最大连续子序列-dp+位置标记

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  9. HDU 1078 FatMouse and Cheese ( DP, DFS)

    HDU 1078 FatMouse and Cheese ( DP, DFS) 题目大意 给定一个 n * n 的矩阵, 矩阵的每个格子里都有一个值. 每次水平或垂直可以走 [1, k] 步, 从 ( ...

随机推荐

  1. javascrit开发的基本代码结构的

    今天看到群里一个demo,简单看了一下. 然后自己就写了一个通用的javascrit开发的基本代码结构的js文件. 代码例如以下: (function($,win){ //定义全局变量对象 var o ...

  2. 我的前端规范——JavaScript篇

    相关文章 简书原文:https://www.jianshu.com/p/5918c283cdc3 我的前端规范——开篇:http://www.cnblogs.com/shcrk/p/9271561.h ...

  3. angular自定义管道

    原文地址 https://www.jianshu.com/p/5140a91959ca 对自定义管道的认识 管道的定义中体现了几个关键点: 1.管道是一个带有“管道元数据(pipe metadata) ...

  4. 【50.00%】【codeforces 602C】The Two Routes

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. SpringMvc中两个Controller类之间传递参数的方法

    使用SpringMvc框架,在访问ControllerA的时候,将A里面的参数传递到ControllerB中.适用于同一框架下两个不同Controller或者由rpc(dubbo)连接的两个工程里的C ...

  6. [Vue] Create Vue.js Layout and Navigation with Nuxt.js

    Nuxt.js enables you to easily create layout and navigation by replacing the default App.vue template ...

  7. 建立简单的服务器端程序 分类: B1_JAVA 2013-10-08 21:53 503人阅读 评论(0) 收藏

      参考自core java     package com.lujinhong.corejava; import java.io.IOException; import java.io.InputS ...

  8. Windows Phone 8.1 Tiles, Notifications and Action Center

    (1)Tiles Tiles 也就是磁贴,是 Windows Phone 的一大特色. 一个 Tile 其实可以看成是一个 XML,比如: <tile> <visual> &l ...

  9. 编辑器sublime、终端运行python

    sublime编辑器 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用) Sublime Text是由程序员Jon Skinner于2008年1月份 ...

  10. sublime-1 sublime设置到鼠标右键

    sublime-1 sublime设置到鼠标右键 一.总结 一句话总结:其实windows可以更加熟悉一点才好,毕竟用的那么多,regedit可以添加注册,也可以添加鼠标右键选项. 二.sublime ...