POJ 3340 Barbara Bennett's Wild Numbers

問題

数字と'?'からなる文字列wと数xがマッチするとは、
wのそれぞれの'?'を任意の数字一文字に置き換えたとき、xと一致することを言う。


パターンwと数xが与えられる。
xより大きくwにマッチする数の総数を求めよ。

制約条件

wとxの桁は等しく、かつ10桁以下

方針

典型的な数字DP
dp[i][j]をi桁目まで見て、今まででxより大きくなっていたらj=1そうでなければj=0
であるような数の数であるとする。


このテーブルを更新するような動的計画法により数字の総数が求まる。

ソースコード

char w[20],x[20];
ll n,dp[20][2]; //pos, grater

int main(){
  while(gets(w),w[0]!='#'){
    gets(x);
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    n=strlen(x);
    rep(i,n)rep(greater,2)rep(j,10){
      
      int ngreater=greater||x[i]-'0'<j;
      if(!ngreater&&j<x[i]-'0')continue;
      if(w[i]!='?'&&w[i]-'0'!=j)continue;
      
      dp[i+1][ngreater]+=dp[i][greater];
    }
    printf("%lld\n",dp[n][1]);
  }
  return 0;
}