This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
using namespace std;
/*
dp[1] = 0
Let dp[i] = the minimum cost to connect pillar 1 and pillar i
dp[i] = min{dp[j] + sq(h[i] - h[j]) + w_sum[i-1] - w_sum[j] | j=1..i-1}
= min{dp[j] + sq(h[i]) - 2*h[i]*h[j] + sq(h[j]) + w_sum[i-1] - w_sum[j]}
= sq(h[i]) + w_sum[i-1] + min{ (-2*h[j]) * h[i] + (dp[j] + sq(h[j]) - w_sum[j]) }
A * X + B
*/
const long long INF = 1'000'000'000'000'000'000LL;
long long sq(long long x)
{
return x*x;
}
int main()
{
int n;
cin >> n;
long long h[n+1];
for(int i = 1; i <= n; i++) cin >> h[i];
long long w[n+1], w_sum[n+1];
w_sum[0] = 0;
for(int i = 1; i <= n; i++)
{
cin >> w[i];
w_sum[i] = w_sum[i-1] + w[i];
}
long long dp[n+1];
dp[1] = 0;
for(int i = 2; i <= n; i++)
{
dp[i] = INF;
for(int j = 1; j < i; j++)
dp[i] = min(dp[i], dp[j] + sq(h[i] - h[j]) + w_sum[i-1] - w_sum[j]);
}
cout << dp[n] << '\n';
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |