10. ⽅方針の前に
¤ 気付いてほしいこと
¤ 結合する⽂文字列列は「2つ以上」とあるが、考えるのは2つの⽂文字列列
を結合する場合だけでいい
¤ ⽂文字列列 A に⽂文字列列 B を⾜足してできた⽂文字列列 A + B
¤ 必ず A < A + B (辞書順⽐比較の定義より)
¤ 2つの⽂文字列列を結合した⽂文字列列の中で辞書順最⼩小なものを A と
おく。A に何を⾜足しても辞書順最⼩小にはならない
14. 辞書順⽐比較の実装例例
¤ ⾃自前で実装してもいいけど…
¤ Java
¤ a.compareTo(b) : a < b なら負の値が返る
¤ C++
¤ a < b
¤ C
¤ strcmp(a, b) : a < b なら負の値が返る
¤ ⾃自分のよく使う⾔言語のライブラリは調べておこう
33. int time = 0;
bool[][] visited; visited[sy][sx] = true;
List<int> marks; marks.add(sy*1000+sx);
while (true) {
time += 1;
List<int> next_marks;
for (int state in marks)
int i = state / 1000;
int j = state % 1000;
if (!search[i][j]) continue;
// 4近傍を調べる。
// visited or 壁なら continue
// 場所を next_marks に追加。
}
}
}
marks = next_marks; 実装例例2
40. ⽅方針2 : 再帰で解く/実装例例
function rec(int n, int i) {
if (n >= N+1) return 0;
int down = rec(n+1, i) + a[n][i];
int right = rec(n+1, i+1) + a[n][i];
int ret = max(down, right);
return ret;
}
43. ⽅方針2 : 再帰で解く/実装例例
int[][] memo; // -1で初期化済み
function rec(int n, int i) {
if (n >= N+1) return 0;
if (memo[n][i] != -1) return memo[n][i];
int down = rec(n+1, i) + a[n][i];
int right = rec(n+1, i+1) + a[n][i];
int ret = max(down, right);
memo[n][i] = ret;
return ret;
}