백준 1823번, 수확 풀이
2021. 1. 9. 15:11ㆍProblem Solving/백준
문제
풀이
$ dp[i][j] = $ 왼쪽에서 $ i $번째, 오른쪽에서 $ j $번째를 뽑을 차례일 때의 최대 이익으로 점화식을 세우면 풀 수 있습니다. (단, $i < j$)
소스코드
#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef unordered_map<int, int> mpii;
int dp[2001][2001];
int vec[2001];
int solve(int l, int r, int c) {
int &ret = dp[l][r];
if (ret) return ret;
if (l > r) return 0;
return ret =
max(
solve(l + 1, r, c + 1) + c * vec[l],
solve(l, r - 1, c + 1) + c * vec[r]
);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> vec[i];
cout << solve(1, n, 1);
}
'Problem Solving > 백준' 카테고리의 다른 글
백준 1407번, 2로 몇 번 나누어질까 풀이 (0) | 2021.01.17 |
---|---|
백준 1943번, 동전 분배 풀이 (0) | 2021.01.11 |
백준 1939번, 중량제한 풀이 (0) | 2021.01.07 |
백준 2170번, 선 긋기 풀이 (0) | 2020.12.30 |
백준 4913번, 페르마의 크리스마스 정리 풀이 (0) | 2020.12.26 |