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

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
 

#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的更多相关文章

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

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

  2. HDU-4249-A Famous Equation(DP)

    Problem Description Mr. B writes an addition equation such as 123+321=444 on the blackboard after cl ...

  3. HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)

    HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...

  4. HDOJ(HDU).2546 饭卡(DP 01背包)

    HDOJ(HDU).2546 饭卡(DP 01背包) 题意分析 首先要对钱数小于5的时候特别处理,直接输出0.若钱数大于5,所有菜按价格排序,背包容量为钱数-5,对除去价格最贵的所有菜做01背包.因为 ...

  5. HDOJ(HDU).2602 Bone Collector (DP 01背包)

    HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...

  6. HDOJ(HDU).1058 Humble Numbers (DP)

    HDOJ(HDU).1058 Humble Numbers (DP) 点我挑战题目 题意分析 水 代码总览 /* Title:HDOJ.1058 Author:pengwill Date:2017-2 ...

  7. HDOJ(HDU).1003 Max Sum (DP)

    HDOJ(HDU).1003 Max Sum (DP) 点我挑战题目 算法学习-–动态规划初探 题意分析 给出一段数字序列,求出最大连续子段和.典型的动态规划问题. 用数组a表示存储的数字序列,sum ...

  8. HDOJ 1501 Zipper 【简单DP】

    HDOJ 1501 Zipper [简单DP] Problem Description Given three strings, you are to determine whether the th ...

  9. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

随机推荐

  1. jQuery事件大全

    jQuery事件大全 attribute:  $(" p" ).addclass(css中定义的样式类型) 给某个元素添加样式 $(" img" ).attr( ...

  2. 无比奇怪的问题,Runtime报错,程序仍可运行(有可能是线程崩溃,但主程序不崩溃,线程崩溃可能是因为锁使用不当引起的)

    但主界面仍可操作. 我估计是,线程运行崩溃,不影响主界面的运行(如果你不去点击那个确认错误的对话框的话). 仔细分析,我估计是使用锁不当引起的.有2种情况下必崩溃: 1. 对没有上锁的锁进行解锁 2. ...

  3. Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通

    原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...

  4. #pragma详解

    在#Pragma是预处理指令它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有 ...

  5. SAE php 研究(2)

    1.在SAE新建项目打印出phpinfo <?php  print phpinfo(); ?> 2. 可见:PHP Version 5.3.8 [使用的是php5.3.8编译的] 3. 可 ...

  6. sql server 2012 数据库还原方法

    USE master RESTORE DATABASE WSS_Content FROM DISK = N'D:\bak\contentbak.bak' WITH REPLACE, NORECOVER ...

  7. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  8. 基于模糊Choquet积分的目标检测算法

    本文根据论文:Fuzzy Integral for Moving Object Detection-FUZZ-IEEE_2008的内容及自己的理解而成,如果想了解更多细节,请参考原文.在背景建模中,我 ...

  9. Program1-1

    package com.algo; import java.util.Random; import java.util.Scanner; public class P1_1 { static int ...

  10. Typings实现智能

    在Visual Studio Code中通过Typings实现智能提示功能   前言 我们知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也有一些简单的提示,但这是通过代码片段提供的.功能 ...