HDU 3507 Print Article

来源:互联网 发布:工程量预算软件 编辑:程序博客网 时间:2024/05/20 22:01

利用斜率来优化dp

参考:

http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html

#include <cstdio>#include <iostream>#include <string.h>#include <queue>#include <vector>using namespace std;#define ll long longconst int N = 500005;int dp[N], sum[N], q[N];int n, m, head ,tail;int getdp(int i, int j){    return dp[j] + m + (sum[i] - sum[j])*(sum[i] - sum[j]);}int getup(int i, int j){    return dp[i] + sum[i]*sum[i] - dp[j] - sum[j]*sum[j];}int getdown(int i, int j){    return 2 * (sum[i] - sum[j]);}int main(){    while(~scanf("%d%d",&n,&m)){        dp[0] = sum[0] = 0;        for(int i = 1; i <= n; i++){            scanf("%d",sum+i);            sum[i] = sum[i-1] + sum[i];        }        head = tail = 0;        q[tail++] = 0;        for(int i = 1; i<= n; i++){            while(head+1 < tail && getup(q[head+1],q[head]) <= sum[i] * getdown(q[head+1],q[head]))                head++;            dp[i] = getdp(i,q[head]);            while(head+1 < tail && getup(i,q[tail-1]) * getdown(q[tail-1],q[tail-2]) <= getup(q[tail-1],q[tail-2]) * getdown(i,q[tail-1]))                tail--;            q[tail++] = i;        }        printf("%d\n",dp[n]);    }    return 0;}


0 0
原创粉丝点击