37
DP特集 菅原研M2

DP特集

Embed Size (px)

DESCRIPTION

プログラミングコンテスト勉強会での発表スライド。2012年国内予選出場者向けの、グラフとDPを用いて解く問題の解説

Citation preview

  • 1. DPM2

2. DP Dynamic Programming()DP DP () (bitDP) 3. 2010/D: Mr.Rito Post Office http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200 4. A BCDEF 5. A(z1) : A -> D -> B -> A -> D()A BCDEF 6. A -> D A BCDEF 7. A E D 20 A E D 15 A E D 10A BCDEF 8. A E D 20 A E D 15 A E D 10A BCDEF 9. DA BCDEF 10. A BCDEF B 11. A BCDEF B BA D D B 12. A BCDEF () 13. A BCDEF D AED 3 14. A BCDEF B 15. {, }={x, s} {x+1, i} x x+1x+1, ix, 0x, 1....x, N-1 16. {x+1, 0N-1} x x+1x+1, ix, 0x, 1....x, N-1 17. x x+1x, 0x, 1....x, N-1 * 0()0, 00, 1....0, N-1x+1, 0x+1, 1....x+1, N-1R, 0R, 1....R, N-1 18. dp[x][i] := xi 1,000 200 1,000 * 200 = 200,000 100,000,000 19. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[1][go[0]] = 0;for (int i = 1 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] == INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}} 20. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[1][go[0]] = 0;for (int i = 1 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] == INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}}INF: 21. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[1][go[0]] = 0;for (int i = 0 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] == INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}} : 0 22. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[1][go[0]] = 0;for (int i = 1 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] == INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}} i j (=INF) 23. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[1][go[0]] = 0;for (int i = 0 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] == INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}} k 24. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[1][go[0]] = 0;for (int i = 1 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] == INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}} 25. i a j b a bi j 26. a -> i i -> j j -> b a -> b a bi j 27. a -> i dfs () () a i 28. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[0][0] = 0;for (int i = 0 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] >= INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}} 29. int[][] dp = new int[R+1][N];for (int i = 0 ; i < R+1 ; i++)Arrays.fill(dp[i], INF);dp[0][0] = 0;for (int i = 1 ; i < R ; i++) {for (int j = 0 ; j < N ; j++) {if (dp[i][j] == INF) conitnue;for (int k = 0 ; k < N ; k++) {dp[i+1][k] = min(dp[i+1][k],dp[i][j] + ()}}} R * N * N = 40,000,00 30. (N