hdu 4249 A Famous Equation (dp 细节)
来源:互联网 发布:图纸绘制软件 编辑:程序博客网 时间:2024/06/08 03:45
A Famous Equation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 514 Accepted Submission(s): 153
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: 3Case 2: 1HintThere are three solutions for the first case:7+10=17, 7+11=18, 7+12=19There is only one solution for the second case:11+11=22Note that 01+21=22 is not a valid solution because extra leading zeros are not allowed.
Source
Fudan Local Programming Contest 2012
题意:
给你一个式子a+b=c,有些位变为不确定?,问你有多少种可能使等式成立。
注意不能有前导0,0不算。
思路:
先把a、b都添0位数和c补齐,dp[i][j][k][2]表示到第i位时,a那位数字为j,b那位数字为k,第i位是否有进位的种数。逐位递推,枚举每一位可能的情况,注意前导0的时不要转移。
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <string>#define mod 1000000007typedef long long ll;using namespace std;int n,lena,lenb,lenc;char s[105];string a,b,c,aa,bb;ll ans,dp[15][15][15][2];void solve(){ int i,j,k,jj,kk; memset(dp,0,sizeof(dp)); dp[lenc][0][0][0]=1; for(i=lenc; i>0; i--) { for(j=0; j<=9; j++) { if(lenc-i==lena&&lena>1&&j==0) continue ; // 前导0 不要转移 for(k=0; k<=9; k++) { if(lenc-i==lenb&&lenb>1&&k==0) continue ; // 前导0 不要转移 if(dp[i][j][k][0]==0&&dp[i][j][k][1]==0) continue ; for(jj=0; jj<=9; jj++) { if(!(a[i-1]=='?'||a[i-1]==jj+'0')) continue ; for(kk=0; kk<=9; kk++) { if(!(b[i-1]=='?'||b[i-1]==kk+'0')) continue ; if(c[i-1]=='?'||(jj+kk)%10==c[i-1]-'0') { if(lenc>1&&i-1==0&&jj+kk==0) ; else dp[i-1][jj][kk][(jj+kk>=10)?1:0]+=dp[i][j][k][0]; } if(c[i-1]=='?'||(jj+kk+1)%10==c[i-1]-'0') { dp[i-1][jj][kk][(jj+kk+1>=10)?1:0]+=dp[i][j][k][1]; } } } } } } ans=0; for(j=0;j<=9;j++) { if(lena==lenc&&j==0&&lena>1) continue ; for(k=0;k<=9;k++) { if(lenb==lenc&&k==0&&lenb>1) continue ; ans+=dp[0][j][k][0]; } }}int main(){ int i,j,ca=0; while(~scanf("%s",s)) { a=""; lena=lenb=lenc=0; for(i=0; s[i]!='+'; i++) lena++,a+=s[i]; b=""; for(i++; s[i]!='='; i++) lenb++,b+=s[i]; c=""; for(i++; s[i]!='\0'; i++) lenc++,c+=s[i]; aa=a; bb=b; for(i=1; i<=lenc-lena; i++) a="0"+a; for(i=1; i<=lenc-lenb; i++) b="0"+b; solve(); printf("Case %d: %I64d\n",++ca,ans); } return 0;}/*?+0=?0+?=??+?1=??1?+?=?1?+??=????+??=10??+?=??+?=???????????+?????????=?????????*/
0 0
- hdu 4249 A Famous Equation (dp 细节)
- HDU-4249-A Famous Equation(DP)
- HDU:4249 A Famous Equation(数位DP)
- HDU 4249 A Famous Equation(数位DP)
- HDOJ 4249 A Famous Equation DP
- 【DP】 hdu4249 A Famous Equation
- hdu 4249 A Famous Equation【DP】【Fudan Local Programming Contest 2012 E】
- hdu4249 A Famous Equation
- HDU 4248 A Famous Stone Collector(DP + 组合数)
- HDU 4248 A Famous Stone Collector (dp)
- hdu 4248 A Famous Stone Collector(组合数学&DP)
- hdu 4248 A Famous Stone Collector dp+组合数学
- [ACM] hdu 4248 A Famous Stone Collector (DP+组合)
- hdu 4225 A Famous Grid(bfs)
- hdu 5185 Equation(DP,思路)
- hdu 5185 Equation(dp题)
- HDU 5185 Equation (DP)
- (hdu 4245 & hdu 4256) A Famous Music Composer 、The Famous Clock ( C++ map)
- 求平均数的简单方法
- [原]Java web学习系列之 Java web开发中的Spring整合Hibernate
- 获取IRP缓冲区的长度
- java基础教程-多线程编程
- DuiLib : 在CListUI中得到滚动条滚动通知
- hdu 4249 A Famous Equation (dp 细节)
- 教程:使用 MongoDB、WCF、OData 和 PowerBI 构建 Azure 上的商业智能解决方案
- K均值聚类算法
- Material Design入门
- 1093. Air Express
- STL--map用法详解
- ListItemType
- Xcode6模拟器iOS8键盘出不来问题
- C#中客户端和服务端之间实现关机