⭐️ 이분 탐색으로 풀이
left 는 가장 왼쪽 인덱스, right 는 가장 오른쪽 인덱스로 정의mid 구하기left-mid 의 비용과 left-right 의 비용 비교left-right 의 비용이 더 크면 mid 를 거치는 것이 효율적인 방법이므로 이때 비용은 ans 에 최대값 비교해서 저장해두고 mid 이후 돌들을 판단하기 위해 left = mid 로 갱신left-mid 의 비용이 더 크거나 left 다음에 바로 right 라면 마지막 돌까지 바로 가는 것이 더 효율적인 방법이라는 것이므로 이때 비용 ans 에 최대값 비교해서 저장하고 break방법이 맞는지는 모르겠으나 오답
정확한 풀이방법이 감이 오지 않음
⭐️ dp 로 풀이
dp 를 참조 ➡️ long long& cur=dp[a];이분탐색으로 접근해서 잘못된 방법으로 풀이
잘 시도해보지 않았던 풀이방법이라서 이해하기 어려웠음. 비슷한 유형으로 연습이 필요하고 이분 탐색에 아직 익숙해지지 않음
참조형 변수를 활용하여 굳이 dp 에 현재 위치를 갱신해주는 작업을 하지 않아도 괜찮았음. 참조형 변수를 적극적으로 활용하면 좋을 것 같음
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
int n;
long long dp[5001];
long long stone[5001];
long long go(int a) {
if(a==n-1) return 0;
long long& cur=dp[a];
if(cur!=0) return cur;
cur=1e10;
for(int i=a+1;i<n;i++) {
cur=min(cur,max(go(i),(i-a)*(1+abs(stone[i]-stone[a]))));
}
return cur;
}
int main() {
cin >> n;
for(int i=0;i<n;i++) {
cin >> stone[i];
}
cout << go(0) << endl;
}