yukicoder No.874 - 正規表現間距離

Source

ニコニコミュニティ
問題文

問題概要

省略

解法

省略

cLayversion 20190830-1)のコード

C++に変換後のコードはこちら

char A[2002], B[2002];
int As, Bs, Ar[2002], Br[2002];

int dp[2002][2002];

int solve(int x, int y){
  int k, res = int_inf;

  if(dp[x][y] >= 0) return dp[x][y];

  if(x-1 >= 0 && Ar[x-1]) res <?= solve(x-1, y);
  if(y-1 >= 0 && Br[y-1]) res <?= solve(x, y-1);

  if(x-1 >= 0) res <?= solve(x-1, y) + 1;
  if(y-1 >= 0) res <?= solve(x, y-1) + 1;

  if(x-1 >= 0 && y-1 >= 0){
    k = if[A[x-1] == B[y-1], 0, 1];
    res <?= solve(x-1, y-1) + k;
    if(Ar[x-1]==1) res <?= solve(x, y-1) + k;
    if(Br[y-1]==1) res <?= solve(x-1, y) + k;
  }

  return dp[x][y] = res;
}

{
  int i, k, res;
  rd(A@As, B@Bs);
  
  k = 0;
  rep(i,As){
    A[k++] = A[i];
    if(i+1 < As && A[i+1] == '*') Ar[k-1] = 1, i++, continue;
    if(i+1 < As && A[i+1] == '?') Ar[k-1] = 2, i++, continue;
  }
  As = k;
  
  k = 0;
  rep(i,Bs){
    B[k++] = B[i];
    if(i+1 < Bs && B[i+1] == '*') Br[k-1] = 1, i++, continue;
    if(i+1 < Bs && B[i+1] == '?') Br[k-1] = 2, i++, continue;
  }
  Bs = k;
  
  rep(i,As+1) rep(j,Bs+1) dp[i][j] = -1;
  dp[0][0] = 0;
  res = solve(As, Bs);
  wt(res);
}

Current time: 2024年04月20日23時00分07秒
Last modified: 2019年09月01日01時06分03秒 (by laycrs)
Tags: Competitive_Programming_Incomplete yukicoder
トップページに戻る

Logged in as: unknown user (not login)

ログイン: