夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

topcoder srmライブコーディングでやったやつ

Div1Easyですね、なんか…

XorTravelingSalesman

幅優先のDPだとはすぐにわかって実装したんですが、uncaught exception出しまくって(よくわからないけど)本質的じゃないところを調整しまくってました。
最終的にはなんか101/100でWAとかあきらかにバグってるだろみたいなテスト結果が出てきたりしましたが、なんとかACコードに調節できた…

これは実装力の問題なのか、単なる運なのか…うーん…

class XorTravelingSalesman {
public:
  int dp[55][5555];
  int maxProfit( vector <int> cityValues, vector <string> roads ) {
    // 現在の価値 : p
    // 街の価値 : x
    // 次の価値 : p ^ x
    // 街はなんどでも通って良い、行ける価値と街、DP?
    // i-th element j-th character -> iからj
    vector<int> road[50];
    int c = cityValues.size();
    for (int i=0; i<c; i++) {
      for (int j=0; j<c; j++) {
        if (roads[i][j]=='Y') road[i].push_back(j);
      }
    }
    memset(dp, 0, sizeof(dp));
    int res = 0;
    queue<P> que;
    que.push(P(0,cityValues[0]));
    dp[0][cityValues[0]] = 1;
    while (!que.empty()) {
      P p = que.front(); que.pop();
      int npos = p.first;
      int val = p.second;
      for (int i=0; i<road[npos].size(); i++) {
        int j = road[npos][i];
        int nval = val ^ cityValues[j];
        if (dp[j][nval]) continue;
        dp[j][nval] = 1;
        que.push(P(j,nval));
      }
    }
    for (int i=0; i<c; i++) {
      for (int j=0; j<3333; j++) {
        if (dp[i][j]) res = max(res, j);
      }
    }
    return res;
  }
};