Submission #438849

#TimeUsernameProblemLanguageResultExecution timeMemory
438849blueBuilding Bridges (CEOI17_building)C++17
30 / 100
3055 ms4392 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...