斜率优化第一道——hdu3507(有图)

来源:互联网 发布:淘宝cfcdk是真的吗 编辑:程序博客网 时间:2024/05/16 07:37

/ dp[i]= min{ dp[j]+M+(sum[i]-sum[j])^2 };
斜率优化不等式的右边,要保证是单调的,才能用斜率优化

推导过程,第一次,可能有一些小问题


#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;int n,a[600005],q[600005],head,m,tail,sum[600005],f[600005];int get1(int j,int k)//getup分子函数{return f[j]+sum[j]*sum[j]-f[k]-sum[k]*sum[k];}int get2(int j,int k)//getdown分母函数{return 2*sum[j]-2*sum[k];}int getdp(int i,int b)//getdp函数,算是dp方程函数吧。          以上三个函数配斜率优化{return f[b]+(sum[i]-sum[b])*(sum[i]-sum[b])+m;}int main(){while (scanf("%d%d",&n,&m)==2){memset(sum,0,sizeof(sum));memset(q,0,sizeof(q));memset(f,0,sizeof(f));for (int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];head=tail=1;q[1]=0;//单调队列,并且一定要把0加进去,因为可能会有一段从0开始for (int i=1;i<=n;i++){while (head<tail&&get1(q[head+1],q[head])//队首出队<=sum[i]*get2(q[head+1],q[head])) head++;//保证head<tail,因为要必须要留一个,不能为空  int b=q[head]; f[i]=getdp(i,b);//  while (head<tail&& get1(i,q[tail]) * get2(q[tail],q[tail-1])<= get1(q[tail],q[tail-1]) * get2(i,q[tail])) tail--;//插入,队尾出队q[++tail]=i;//}printf("%d\n",f[n]);}return 0;}


0 0
原创粉丝点击