arrows blog

解いた問題などを適当に書いていきます。

SRM 650 div2 Med

問題概要

'A','B','?'で構成される文字列がある。全ての'?'を'A'または'B'で置き換えたとき、最終的な得点を最小化せよ。得点は、連続する文字列で"AA"または"BB"となるものが1pointである。ただし、overlapも考えるので、"BBB"は2pointとなる。

制約

  • 1 ≤ |S| ≤ 50

解法

dpする。
dp[何文字目]['A'or'B'] := 最小の得点。

コード

#define INF 1e9

class TaroFillingAStringDiv2 {
public:
  int getNumber(string S) {
    int len = S.size();
    int dp[51][2];
    fill(dp[0],dp[0]+51*2,INF);
    if(S[0] == 'A'){
      dp[0][0] = 0;
    }else if(S[0] == 'B'){
      dp[0][1] = 0;
    }else{
      dp[0][0] = dp[0][1] = 0;
    }
    for(int i = 1 ; i < len ; i++){
      if(S[i] == '?'){
        dp[i][0] = min(dp[i-1][0]+1,dp[i-1][1]);
        dp[i][1] = min(dp[i-1][0],dp[i-1][1]+1);
      }else if(S[i] == 'A'){
        dp[i][0] = min(dp[i-1][0]+1,dp[i-1][1]);
      }else{
        dp[i][1] = min(dp[i-1][0],dp[i-1][1]+1);
      }
    }
    return min(dp[len-1][0],dp[len-1][1]);
  }
};