HDOJ 4249 A Famous Equation DP
DP:
DP[len][k][i][j] 再第len位,第一个数len位为i,第二个数len位为j,和的第len位为k
每一位能够从后面一位转移过来,能够进位也能够不进位
A Famous Equation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 500 Accepted Submission(s): 147
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.
number is no more than 9. In the other words, the equation will contain three integers less than 1,000,000,000.
7+1?=1?
?1+? 1=22
Case 1: 3
Case 2: 1HintThere 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.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack> using namespace std; typedef long long int LL; char cpp[200];
int a[200],len1,b[200],len2,c[200],len3;
LL dp[20][20][20][20]; int main()
{
int cas=1;
while(cin>>cpp)
{
len1=len2=len3=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int n=strlen(cpp);
int i; stack<char> stk;
for(i=0;i<n;i++)
{
if(cpp[i]=='+')
{
while(!stk.empty())
{
char c=stk.top(); stk.pop();
if(c!='? ') a[len1++]=c-'0';
else a[len1++]=-1;
}
i++;
break;
}
stk.push(cpp[i]);
}
for(;i<n;i++)
{
if(cpp[i]=='=')
{
while(!stk.empty())
{
char c=stk.top(); stk.pop();
if(c!='? ') b[len2++]=c-'0';
else b[len2++]=-1;
}
i++;
break;
}
stk.push(cpp[i]);
}
for(;i<n;i++) stk.push(cpp[i]);
while(!stk.empty())
{
char cc=stk.top(); stk.pop();
if(cc!='?') c[len3++]=cc-'0';
else c[len3++]=-1;
} for(int i=len1-1;i>0;i--) if(a[i]==0) len1--; else break;
for(int i=len2-1;i>0;i--) if(b[i]==0) len2--; else break;
for(int i=len3-1;i>0;i--) if(c[i]==0) len3--; else break; memset(dp,0,sizeof(dp)); ///len==0
for(int i=0;i<=9;i++)
{
if(a[0]==-1||a[0]==i)
for(int j=0;j<=9;j++)
{
if(b[0]==-1||b[0]==j)
for(int k=0;k<=9;k++)
if(c[0]==-1||c[0]==k)
{
if(k==(i+j)%10)
dp[0][k][i][j]=1;
}
}
}
///len=1...
for(int len=1;len<len3;len++)
{
for(int i=0;i<=9;i++)
{
if(len==len1-1&&i==0) continue;
if(len>=len1&&i!=0) continue;
if(a[len]==-1||a[len]==i)
for(int j=0;j<=9;j++)
{
if(len==len2-1&&j==0) continue;
if(len>=len2&&j!=0) continue;
if(b[len]==-1||b[len]==j)
for(int k=0;k<=9;k++)
{
if(len==len3-1&&k==0) continue;
if(((i+j)%10!=k)&&((i+j+1)%10!=k))
continue;
if(c[len]==-1||c[len]==k)
{
///没有进位
if((i+j)%10==k)
{
for(int ii=0;ii<=9;ii++)
for(int jj=0;jj<=9;jj++)
for(int kk=0;kk<=9;kk++)
{
if((ii+jj==kk)||(ii+jj+1==kk))
dp[len][k][i][j]+=dp[len-1][kk][ii][jj];
}
}
///有进位
if((i+j+1)%10==k)
{
for(int ii=0;ii<=9;ii++)
for(int jj=0;jj<=9;jj++)
for(int kk=0;kk<=9;kk++)
{
if(((ii+jj>=10)&&(ii+jj)%10==kk)||((ii+jj+1>=10)&&(ii+jj+1)%10==kk))
dp[len][k][i][j]+=dp[len-1][kk][ii][jj];
}
}
}
}
}
}
}
LL ans=0;
int mx=max(len1,max(len2,len3));
for(int i=0;i<=9;i++)
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
if((i+j==k)||(i+j+1==k))
{
if(mx==1&&i+j!=k) continue;
ans+=dp[mx-1][k][i][j];
}
cout<<"Case "<<cas++<<": "<<ans<<endl;
memset(cpp,0,sizeof(cpp));
}
return 0;
}
HDOJ 4249 A Famous Equation DP的更多相关文章
- HDU 4249 A Famous Equation(数位DP)
题目链接:点击打开链接 思路:用d[i][a][b][c][is]表示当前到了第i位, 三个数的i位各自是a,b,c, 是否有进位 , 的方法数. 细节參见代码: #include<cstdio ...
- HDU-4249-A Famous Equation(DP)
Problem Description Mr. B writes an addition equation such as 123+321=444 on the blackboard after cl ...
- HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)
HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...
- HDOJ(HDU).2546 饭卡(DP 01背包)
HDOJ(HDU).2546 饭卡(DP 01背包) 题意分析 首先要对钱数小于5的时候特别处理,直接输出0.若钱数大于5,所有菜按价格排序,背包容量为钱数-5,对除去价格最贵的所有菜做01背包.因为 ...
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...
- HDOJ(HDU).1058 Humble Numbers (DP)
HDOJ(HDU).1058 Humble Numbers (DP) 点我挑战题目 题意分析 水 代码总览 /* Title:HDOJ.1058 Author:pengwill Date:2017-2 ...
- HDOJ(HDU).1003 Max Sum (DP)
HDOJ(HDU).1003 Max Sum (DP) 点我挑战题目 算法学习-–动态规划初探 题意分析 给出一段数字序列,求出最大连续子段和.典型的动态规划问题. 用数组a表示存储的数字序列,sum ...
- HDOJ 1501 Zipper 【简单DP】
HDOJ 1501 Zipper [简单DP] Problem Description Given three strings, you are to determine whether the th ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
随机推荐
- Boost::Thread 多线程的基础知识
Boost.Thread可以使用多线程执行可移植C++代码中的共享数据.它提供了一些类和函数来管理线程本身,还有其它一些为了实现在线程之间同步数据或者提供针对特定单个线程的数据拷贝.头文件:#incl ...
- 解决Ajax.BeginForm还是刷新页面的问题
在.net mvc中用Ajax.BeginForm来实现异步提交,在Ajax.BeginForm里面还是可以用submit按钮,一般来说 submit按钮是提交整个页面的数据.但是在Ajax.Begi ...
- 用DELPHI的RTTI实现对象的XML持久化
去年我花了很多时间尝试用DELPHI进行基于XML的WEB应用开发.起初的设想是很美好的,但结果做出来的东西很简陋.一部分原因就在于XML到Object之间的数据绑定实现太麻烦(另一部分是因为对XSL ...
- 3D空间中射线与三角形的交叉检測算法
引言 射线Ray,在3D图形学中有非常多重要的应用.比方,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检測等等都能够使用射线Ray来完毕. 所以,在本次博客中,将会简单的像大家介绍下 ...
- 数学之路-python计算实战(2)-初遇pypy
PyPy是Python开发人员为了更好的Hack Python创建的项目.此外,PyPy比CPython是更加灵活,易于使用和试验,以制定详细的功能在不同情况的实现方法,能够非常easy实施. 该项目 ...
- 转]解析C语言中的sizeof
解析C语言中的sizeof 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出 了其操作数的存储大小.操作数 ...
- Js实现select联动,option从数据库中读取
待要实现的功能:页面有两个select下拉列表,从第一个select中选择后,在第二个select中出现对应的列表选择,再从第二个select中选择后,在一个text中显示对应的信息.两个select ...
- PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia)。据说yEd也很不错。
SBCL编译过程 - O.Nixie的专栏 - 博客频道 - CSDN.NET PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia).据说yEd也很不 ...
- cx_Oracle模块学习之绑定变量
有些时候我们需要和程序交互,此时需要绑定量下面两个例子简介在SELECT 和 DML 里面绑定变量的用法 SELECT 里面的绑定变量 [root@Ora10G py]# cat SelectBind ...
- flex网上办(苹果)桌面系统仿真
1.有登录界面 2.能够载入app(每一个app是单独的swf),并可拖动app的图标互相叠加 3.桌面上显示的哪些APP与目录是依据登陆的用户信息.从webservice中读取的(名字.图标信息等) ...