반응형
문제 요약
김치를
이 때, 최대 D만큼만 김치를 숙성시킬 수 있다. (
N은 최대 10만이다.
풀이
문제의 조건에서
넣은 날을
그러면 위 조건 때문에
따라서, 분할정복 최적화를 적용할 수 있다. 최대 D일 만큼만 넣을 수 있다는 조건만 주의하자.
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
vector<ll> T, V, dp;
int D, N;
ll ans;
ll cnt;
ll C(ll i, ll j) {
return V[i] + (j-i) * T[j];
}
void solve(int s, int e, int optl, int optr) {
if(s > e) return ;
int mid = (s+e) >> 1;
int opt = mid;
dp[mid] = V[mid];
pair<ll,int> ret = {V[mid],mid};
for(int i=optl;i<=min(optr, mid+D);++i) {
ll val = V[mid] + (i - mid) * T[i];
if(dp[mid] < val) {
dp[mid] = val; opt = i;
}
}
solve(s, mid-1, optl, opt);
solve(mid+1, e, opt, optr);
}
int main() {
cin.tie(nullptr); ios::sync_with_stdio(false);
cin >> N >> D;
T.resize(N+1); V.resize(N+1); dp.resize(N+1);
for(int i=1;i<=N;++i) cin >> T[i];
for(int i=1;i<=N;++i) cin >> V[i];
solve(1,N,1,N);
for(int i=1;i<=N;++i) ans = max(ans, dp[i]);
cout << ans << '\n';
return 0;
}
반응형
'Problem Solving > 문제풀이' 카테고리의 다른 글
백준 16138번 수강신청 (2) | 2021.02.16 |
---|---|
백준 12766번 지사 배정 (0) | 2021.02.16 |
백준 13262번 수열의 OR 점수 (0) | 2021.02.16 |
백준 14636번 Money for Nothing (0) | 2021.02.16 |
백준 13261번 탈옥 (0) | 2021.02.16 |