C++の練習を兼ねて, AtCoder Beginner Contest 210 の 問題C (Colorful Candies) ~ 問題D (National Railway) を解いてみた.
■感想.
1. 問題D は, 方針が見えなかったので, 解説を参考に実装したところ, AC版に到達出来た.
2. 苦手な動的計画法の訓練を積めたので, 非常に良かったと思う.
3. 引き続き, 時間を見つけて, 過去問の学習を進めていきたいと思う.
本家のサイト AtCoder Beginner Contest 210 解説 の 各リンク を ご覧下さい.
■C++版プログラム(問題C/AC版).
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 |
// C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) int c[303030]; int main(){ // 1. 入力情報. int N, K; scanf("%d %d", &N, &K); map<int, int> m; int ans = 0; rep(i, N){ scanf("%d", &c[i]); // K番目まで. if(i < K){ m[c[i]]++; ans = m.size(); } // (K + 1)番目以降. if(i >= K){ // (i - K)番目を除外. m[c[i - K]]--; if(m[c[i - K]] == 0) m.erase(c[i - K]); // i番目を追加. m[c[i]]++; // 最大値更新. ans = max(ans, (int)m.size()); } } // 2. 出力. printf("%d\n", ans); return 0; } |
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 |
[入力例] 7 3 1 2 1 2 3 3 1 [出力例] 3 ※AtCoderテストケースより [入力例] 5 5 4 4 4 4 4 [出力例] 1 ※AtCoderテストケースより [入力例] 10 6 304621362 506696497 304621362 506696497 834022578 304621362 414720753 304621362 304621362 414720753 [出力例] 4 ※AtCoderテストケースより [入力例] 30 7 2 1 5 1 2 1 2 2 2 1 1 3 1 1 1 4 3 3 4 1 1 3 3 3 1 1 5 3 5 1 [出力例] 3 [入力例] 100 11 1 2 1 2 2 2 1 3 2 1 2 1 1 1 2 2 3 3 3 4 4 4 1 1 4 1 3 2 4 2 4 4 1 3 3 2 2 1 2 1 1 1 1 3 2 3 3 2 1 2 3 1 3 2 1 1 3 1 1 3 2 5 3 2 4 4 6 4 1 1 6 5 1 4 1 2 6 5 5 5 6 2 1 4 6 6 2 5 3 3 2 3 3 3 1 4 3 2 3 4 [出力例] 6 |
■C++版プログラム(問題D/AC版).
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 |
// 解き直し. // https://atcoder.jp/contests/abc210/editorial/2298 // C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; using vl = vector<LL>; using vvl = vector<vl>; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) #define pb push_back #define all(x) x.begin(), x.end() const LL INF = 202020202020202020; int main(){ // 1. 入力情報. int H, W; LL C; scanf("%d %d %lld", &H, &W, &C); vvl o, r; rep(i, H){ vl x; rep(j, W){ LL a; scanf("%lld", &a); x.pb(a); } o.pb(x); // グリッド(左右反転版). reverse(all(x)); r.pb(x); } // 2. 最小コスト計算. auto f = [&](vvl &a) -> LL{ // 2-1. dp初期化. LL dp[H + 1][W + 1], pd[H + 1][W + 1]; rep(i, H + 1){ rep(j, W + 1){ // 解説通り. dp[i][j] = 0; pd[i][j] = 0; if(i == 0 || j == 0) dp[i][j] = INF; } } // 2-2. dp更新. repx(i, 1, H + 1){ repx(j, 1, W + 1){ dp[i][j] = min({a[i - 1][j - 1], dp[i - 1][j] + C, dp[i][j - 1] + C}); } } // 2-3. pd更新. repx(i, 1, H + 1){ repx(j, 1, W + 1){ pd[i][j] = min(dp[i - 1][j] + C + a[i - 1][j - 1], dp[i][j - 1] + C + a[i - 1][j - 1]); } } // 2-4. 最小コストは? LL ret = INF; repx(i, 1, H + 1) repx(j, 1, W + 1) ret = min(ret, pd[i][j]); // 2-5. 返却. return ret; }; // 3. 出力. printf("%lld\n", min(f(o), f(r))); return 0; } |
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 |
[入力例] 3 4 2 1 7 7 9 9 6 3 7 7 8 6 4 [出力例] 10 ※AtCoderテストケースより [入力例] 3 3 1000000000 1000000 1000000 1 1000000 1000000 1000000 1 1000000 1000000 [出力例] 1001000001 ※AtCoderテストケースより [入力例] 7 10 15 700 485 632 445 516 312 402 613 610 623 481 512 264 601 556 586 218 531 448 360 235 660 602 112 448 511 643 621 518 290 475 552 506 466 346 266 507 595 467 477 416 320 522 565 232 489 654 685 360 280 598 357 598 695 532 455 300 286 101 580 227 366 520 671 247 611 376 387 292 674 [出力例] 333 [入力例] 20 15 1111 69063 33529 70578 50473 33471 52692 59471 57207 41725 73815 75990 58995 39558 34738 49390 47707 78277 43559 38292 55222 31209 41636 54607 61137 68448 36770 59629 42720 78848 37025 31609 57109 52053 64466 34145 76388 54801 69362 53657 43378 78784 43989 58151 69935 75943 67146 71389 89098 48517 49145 40974 77705 48244 74143 45828 48442 41498 42878 78315 58550 72032 61268 54425 74660 35074 79791 34745 34377 57131 48088 33329 67736 53202 48549 67432 69402 54219 46534 34541 71061 63496 78626 69645 30327 35236 35039 56727 68706 76467 39552 42314 77814 38446 51468 66049 76406 68834 71865 63726 37778 60911 61255 53232 58945 62656 59630 41382 33943 72670 39640 77778 54823 62697 59889 67380 69919 55597 79104 53231 42149 66203 43153 64211 74574 60586 23900 53138 58149 72500 42190 40920 76979 67916 64220 78405 52320 59411 67566 76096 61546 65448 44318 33146 77883 65354 61381 66288 57002 62162 66443 57886 71760 33859 68348 76774 76808 74974 79765 55667 44448 58907 77074 50676 52163 51846 50856 55845 35800 70185 71215 73791 54767 77859 54498 74996 63781 73995 77765 45745 62157 75593 68722 31381 62576 71971 72569 62767 39665 48665 68091 53402 66721 53620 55335 56359 78114 49803 63406 41829 69565 73215 60739 69744 79310 61955 55631 68519 41628 70338 71592 53919 45273 47108 70105 79995 41198 65080 52365 39594 50123 63601 70300 52884 57012 67253 73311 53015 51435 77753 71262 57758 69687 68265 69790 50121 71519 59045 71228 68859 64313 79813 44042 59482 41806 67679 39375 51816 77314 78514 79956 51152 46028 53674 49413 71485 37928 73924 60817 41926 77080 44004 65161 54692 48732 59836 71124 45275 72694 12768 57388 47231 73723 54306 34425 77777 66795 61515 54203 69957 57813 49482 58912 62337 73125 54917 72717 32344 75565 33948 51856 64994 62686 76308 67035 41810 68473 45145 48847 74636 44683 [出力例] 55555 |
■参照サイト
AtCoder Beginner Contest 210