2011 TCO Algorithm Qualification Round 2 medium

問題概要

マスが50個のすごろくみたいなのをする。
スタートゴールは普通のマス。
その他のマスにK, もしくはCと書かれている場合がある。
それ意外は普通のマス
また、K, C の二つの整数が与えられる。
すごろくをはじめてから経った時間をTとする。
T % K == 0 のとき、Kのマスには侵入及び滞在不可能であり、
T % C != 0 のとき、Cのマスには侵入及び滞在不可能である。

解法

dp
状態が、今居る場所 × 今の時間のKによるmod x 今の時間のCによりmod
最初、たどり着ける手数を最大K*Cと見積もって死亡

以下のソースでは、最大手数を200000と見積もって解いている。

ソース

include<string>
using namespace std;
#define REP(i,b,n) for(int i=b;i<(int)n;i++)
#define rep(i,n)   REP(i,0,n)
bool dp[200000][50];
class KindAndCruel {
public:
  int crossTheField(string field, int K, int C) {
    int n = field.length();
    rep(i, 200000)rep(j, 50)dp[i][j] = false;
    dp[0][0] = true;
    rep(i, 200000){
      rep(j, n){
        if(!dp[i][j])continue;
        if(field[j] == 'K' && i % K == 0)dp[i][j] = false;
        if(field[j] == 'C' && i % C != 0)dp[i][j] = false;
        if(!dp[i][j])continue;
        if(i+1 == 200000)continue;
        dp[i+1][max(0, j-1)] = dp[i+1][min(n-1, j+1)] = dp[i+1][j] = true;
      }
    }
    rep(i, 200000){
      if(dp[i][n-1])return i;
    }
    return -1;
  }
};