AOJ0604 Take the 'IOI' Train

Take the 'IOI' train | Aizu Online Judge

Introduction to Programming Introduction to Algorithms and Data Structures Library of Data Structures Library of Graph Algorithms Library of Computational Geometry Library of Dynamic Programming Library of Number Theory

待機用レールは列車を組み始めたら使えない.最初に避難させることは出来るが使いはじめる場所を決めたら,その列車を使うか,その列車以降を使わないかになる.

このように状態を持つと遷移は4パターンになる.

最初は で始め, で終わることに注意する.また,どちらかの列車を全く使わなくても良いので最初に空白を入れて表現してみた(変だ).

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<30
#define pb push_back
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int dp[2005][2005][2];

int main() {
  int n, m;
  cin >> n >> m;

  string s, t;
  cin >> s >> t;

  n++;
  m++;
  s = " " + s;
  t = " " + t;

  memset(dp, 0, sizeof(dp));

  REP(i, 0, n) {
      REP(j, 0, m) {

          if(i == 0 && j == 0) continue;

          bool a = false, b = false;
          if(i == 0) {
              b = true;
          } else if(j == 0) {
              a = true;
          } else {
              a = true;
              b = true;
          }

          if(a) {
              if(dp[i-1][j][1] == 0) {
                  if(s[i] == 'I') {
                      dp[i][j][1] = max(dp[i][j][1], dp[i-1][j][0] + 1);
                  }
              } else {
                  if(s[i] == 'I') {
                      dp[i][j][1] = max(dp[i][j][1], dp[i-1][j][0] + 1);
                  } else {
                      dp[i][j][0] = max(dp[i][j][0], dp[i-1][j][1] + 1);
                  }
              }
          }

          if(b) {
              if(dp[i][j-1][1] == 0) {
                  if(t[j] == 'I') {
                      dp[i][j][1] = max(dp[i][j][1], dp[i][j-1][0] + 1);
                  }
              } else {
                  if(t[j] == 'I') {
                      dp[i][j][1] = max(dp[i][j][1], dp[i][j-1][0] + 1);
                  } else {
                      dp[i][j][0] = max(dp[i][j][0], dp[i][j-1][1] + 1);
                  }
              }
          }
      }
  }

  int ans = 0;
  rep(i, n) {
      rep(j, m) {
          // cout << "(" << dp[i][j][0] << "," << dp[i][j][1] << ") ";
          ans = max(ans, dp[i][j][1]);
      }
      // cout << endl;
  }

  cout << ans << endl;

  return 0;
}
Mar 16th, 2016