HDU-3507 Print Article DP斜率优化
2013-10-22 10:38
393 查看
/* HDU 3507 */ #include<stdio.h> #include<iostream> #include<string.h> #include<queue> using namespace std; const int MAXN=500010; int dp[MAXN]; int q[MAXN];//队列 int sum[MAXN]; int head,tail,n,m; // dp[i]= min{ dp[j]+M+(sum[i]-sum[j])^2 }; int getDP(int i,int j) { return dp[j]+m+(sum[i]-sum[j])*(sum[i]-sum[j]); } int getUP(int j,int k) //yj-yk部分 { return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]); } int getDOWN(int j,int k) { return 2*(sum[j]-sum[k]); } int main() { // freopen("data.in","r",stdin); // freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)==2) { for(int i=1;i<=n;i++) scanf("%d",&sum[i]); sum[0]=dp[0]=0; for(int i=1;i<=n;i++) sum[i]+=sum[i-1]; 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 ); } return 0; }
相关文章推荐
- 文章标题 HDU 3507 :Print Article (斜率dp优化)
- HDU 3507 Print Article DP(斜率优化入门)
- HDU 3507 斜率优化 DP Print Article
- HDU 3507:Print Article(斜率DP)
- Print Article HDU 3507 斜率优化
- hdu 3507 斜率优化DP
- hdu3507 Print Article DP+斜率优化
- hdu 3507 斜率优化dp入门
- HDU 3507 斜率优化dp
- dp斜率优化 Hdu 3507(Print Article)详细题解
- hdu 3507 斜率dp优化
- HDU 3507 Print Article [DP斜率优化]
- hdu 3507 斜率优化dp
- hdu 3507 Print Article 斜率优化DP
- hdu 3507 Print Article(dp斜率优化)
- hdu 3507 斜率优化dp
- hdu 3507 Print Article(斜率优化DP)
- HDU 3507 Print Article(DP+斜率优化)
- 斜率dp优化两题(poj 3709 hdu 3507)
- HDU 斜率优化dp 3507 Print Article