From c77c573f70ea714dd9c7aed9878988524d53fd0b Mon Sep 17 00:00:00 2001 From: oncsr Date: Tue, 8 Jul 2025 17:51:34 +0900 Subject: [PATCH] =?UTF-8?q?[20250708]=20BOJ=20/=20D5=20/=20=ED=83=9D?= =?UTF-8?q?=EB=B0=B0=20=EB=B0=B0=EB=8B=AC=20/=20=EA=B6=8C=ED=98=81?= =?UTF-8?q?=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\353\260\260 \353\260\260\353\213\254.md" | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 "khj20006/202507/08 BOJ D5 \355\203\235\353\260\260 \353\260\260\353\213\254.md" diff --git "a/khj20006/202507/08 BOJ D5 \355\203\235\353\260\260 \353\260\260\353\213\254.md" "b/khj20006/202507/08 BOJ D5 \355\203\235\353\260\260 \353\260\260\353\213\254.md" new file mode 100644 index 00000000..f3f5817a --- /dev/null +++ "b/khj20006/202507/08 BOJ D5 \355\203\235\353\260\260 \353\260\260\353\213\254.md" @@ -0,0 +1,114 @@ +```cpp +#include +using namespace std; +using ll = long long; + +ll A[2001][201]{}, S[2001][201]{}; +ll le[2001]{}, ri[2001]{}; +ll dist[2001][2001]{}, up[2001][2001]{}, down[2001][2001]{}, mid[2001][2001]{}; +pair p[200002]{}; + +int main(){ + cin.tie(0)->sync_with_stdio(0); + + int R, C; + cin>>R>>C; + + for(int i=1;i<=R;i++) { + for(int j=1;j<=C;j++) { + cin>>A[i][j]; + S[i][j] = S[i][j-1] + A[i][j]; + } + le[i] = le[i-1] + A[i][1]; + ri[i] = ri[i-1] + A[i][C]; + } + + for(int j=1;j<=R;j++) { + up[1][j] = S[1][C] + ri[j]-ri[1]; + up[j][1] = S[1][C] + le[j]-le[1]; + } + for(int i=2;i<=R;i++) for(int j=2;j<=R;j++) { + up[i][j] = min(up[i-1][j] + A[i][1], up[i][j-1] + A[j][C]); + if(i=1;i--) for(int j=R-1;j>=1;j--) { + down[i][j] = min(down[i+1][j] + A[i][1], down[i][j+1] + A[j][C]); + if(i>D; + for(int i=1;i<=D;i++) cin>>p[i].first>>p[i].second; + + ll ans = A[1][1]; + for(int i=1;i<=D;i++) { + auto [pr,pc] = p[i-1]; + auto [r,c] = p[i]; + + if(pr == r) { + if(pc < c) { + ll res1 = S[r][c] - S[r][pc]; + ll res2 = dist[r][r] + max(0LL, S[r][C-1]-S[r][c-1]); + if(pc == 1) res2 -= A[pr][1]; + else res2 += S[pr][pc-1]-S[pr][1]; + ans += min(res1, res2); + } + else{ + ll res1 = S[r][pc-1] - S[r][c-1]; + ll res2 = dist[r][r] + max(0LL, S[r][c]-S[r][1]); + if(pc == C) res2 -= A[pr][C]; + else res2 += S[pr][C-1]-S[pr][pc]; + ans += min(res1, res2); + } + } + else { + // prev에서 왼쪽으로, cur에서 오른쪽으로 + ll res1 = dist[pr][r] + max(0LL, S[r][C-1]-S[r][c-1]); + if(pc == 1) res1 -= A[pr][1]; + else res1 += S[pr][pc-1]-S[pr][1]; + // prev에서 오른쪽으로, cur에서 왼쪽으로 + ll res2 = dist[r][pr] + max(0LL, S[r][c]-S[r][1]); + if(pc == C) res2 -= A[pr][C]; + else res2 += S[pr][C-1]-S[pr][pc]; + // prev에서 왼쪽으로, cur에서 왼쪽으로 + ll res3 = (pr