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 ...
随机推荐
- canvas 多种形状绘图方法
function canvasUploadImg(image,imageName,imgType,callbackfn){ var img_width = image.width; var img_h ...
- jquery mobile切换页面的几种方法
jquery mobile切换页面的几种方法 - 不厚道青蛙之焦油潭 - 博客频道 - CSDN.NET jquery mobile切换页面的几种方法 分类: phonegap html5 2012- ...
- Python中的列表解析和生成表达式
摘要:优雅.清晰和务实都是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析( List comprehensions)和生成表达式,通过 ...
- JQuery+AJAX实现搜索文本框的输入提示功能
平时使用谷歌搜索的时候发现只要在文本框里输入部分单词或字母,下面马上会弹出一个相关信息的内容框可供选择.感觉这个功能有较好的用户体验,所以也想在自己的网站上加上这种输入提示框. 实现的原理其实很简单, ...
- Ubuntu下装QQ2012,让linux小白们不怕脱离windows
嘿嘿,很多人可能跟我一样,QQ上同学群里会通知一些事项,所以我们希望可以在linux下开QQ,但是QQ官网做的QQ For Linux, 实在是烂的不行 那么怎么在linux下装我们平时在window ...
- 数学之路-python计算实战(2)-初遇pypy
PyPy是Python开发人员为了更好的Hack Python创建的项目.此外,PyPy比CPython是更加灵活,易于使用和试验,以制定详细的功能在不同情况的实现方法,能够非常easy实施. 该项目 ...
- SAP ABAP exporting list to memory ...SUBMIT 程序传输屏幕参数
SUBMIT report EXPORTING LIST TO MEMORY AND RETURN. submit 关键字的作用就是在程序内部调用一个程序,and retur ...
- Android开发之下载Tomcat服务器的文件到模拟器的SD卡
Tomcat服务器可以到Apache的官网去下载http://tomcat.apache.org/,如何配置和使用百度下也有很多介绍,只要把Java的SDK配下java_home环境变量就行了,因为T ...
- 怎么用CIFilter给图片加上各种各样的滤镜_1
近期在做对图像处理的app,而要对图像进行处理,CoreImage是离不开的框架. 上网Google了一下,大部分的博客都是仅仅讲了怎么给图像加上怀旧(CISepiaTone).模糊(CIBloom) ...
- newlisp 注释生成文档
最近写了一个newlisp_armory库,用来实现一些newlisp自身不支持的操作.比如跨windows和ubuntu的目录拷贝功能等. 自己用的时候,发现没有API reference文档参考, ...