HDU 4258 Covered Walkway【斜率优化dp】

来源:互联网 发布:云计算的教育应用案例 编辑:程序博客网 时间:2024/06/05 14:27

这题跟HDU3507差不多。

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int maxn = 1000010;int n;__int64 c, x[maxn];__int64 dp[maxn];int q[maxn], head, tail;__int64 dy(int j, int i){    return dp[i] + x[i+1] * x[i+1] - (dp[j] + x[j+1] * x[j+1]); }__int64 dx(int j, int i){    return 2 * (x[i+1] - x[j+1]); } void DP(){    dp[0] = 0;    head = tail = 0;    q[tail++] = 0;    for (int i = 1; i <= n; ++i) {        while (tail - head >= 2) {            int k = q[head], j = q[head+1];            if (dy(k, j) < dx(k, j) * x[i]) {                head++;            } else {                break;            }        }        dp[i] = dp[q[head]] + (x[i] - x[q[head]+1]) * (x[i] - x[q[head]+1]) + c;        while (tail - head >= 2) {            int k = q[tail-2], j = q[tail-1];            if (dy(k, j) * dx(j, i) >= dx(k, j) * dy(j, i)) {                tail--;            } else {                break;            }        }        q[tail++] = i;    }    printf("%I64d\n", dp[n]);}int main(){    while (scanf("%d%I64d", &n, &c) != EOF) {        if (n == 0 && c == 0) break;        for (int i = 1; i <= n; ++i) {            scanf("%I64d", &x[i]);        }        for (int i = 2; i <= n; ++i) {            x[i] -= x[1];        }        x[1] = 0;        DP();    }    return 0;}