-
[2281] 데스노트BOJ 2022. 3. 12. 04:32
https://www.acmicpc.net/problem/2281
2281번: 데스노트
첫째 줄에 n(1 ≤ n ≤ 1,000), m(1 ≤ m ≤ 1,000)이 주어진다. m은 노트의 가로 칸의 개수(폭, 너비)이다. 다음 n개의 줄에는 각 사람의 이름의 길이가 노트에 적어야 할 순서대로 주어진다. 각 길이는 m
www.acmicpc.net
dp(i, j) = i번째 이름의 마지막 문자가 j번째 열에서 끝났을때의 최적해로 놓고,
i번째 이름을 새로운 행에 쓰는 경우는 항상 고려하며,
i번째 이름을 기존의 행에 이어서 쓰는 경우에는, (남은 칸)+(i번째 이름의 길이)<=m인 경우에만 고려한다.
실제로는 공백을 두어야 하므로, 재귀로 넘길때에는 (남은 칸)+(i번째 이름의 길이)+1을 넘기게 되는데
이 경우 열을 나타내는 인자가 일시적으로 m을 초과할 수 있다. 이 경우만 별도로 분기해주었다.
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;int n, m, dp[1001][1001];vector<int> v;int f(int i, int c) {if (i >= n) return 0;if (dp[i][c] != -1) return dp[i][c];if (c == m + 1) return f(i, 0);dp[i][c] = (m - c + 1) * (m - c + 1) + f(i + 1, v[i] + 1);if (c + v[i] <= m) dp[i][c] = min(f(i + 1, c + v[i] + 1), dp[i][c]);return dp[i][c];}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);cin >> n >> m;v.resize(n);int i;for (i = 0; i < n; i++) cin >> v[i];memset(dp, -1, sizeof(dp));cout << f(0, 0);return 0;}
'BOJ' 카테고리의 다른 글
[17135] 캐슬 디펜스 (0) 2022.03.12 [7453] 합이 0인 네 정수 (0) 2022.03.12 [2002] 추월 (0) 2022.03.09 [1662] 압축 (0) 2022.03.09 [1256] 사전 (0) 2022.03.06