博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU.2829.Lawrence(DP 斜率优化)
阅读量:4352 次
发布时间:2019-06-07

本文共 1230 字,大约阅读时间需要 4 分钟。

\(Description\)

  给定一个\(n\)个数的序列,最多将序列分为\(m+1\)段,每段的价值是这段中所有数两两相乘的和。求最小总价值。

\(Solution\)

  写到这突然懒得写了。。

  丢个走人

/*朴素O(n^3):f[i][j]表示当前在i分了j段的最小价值 W[i]表示1~i的总价值 S[i]表示1~i的原序列值之和 则有 f[i][j]=min{ f[k][j-1]+W[i]-W[k]-S[i]*(S[i]-S[k]) } (1≤k
#include
#define gc() getchar()typedef long long LL;const int N=1e3+5;int n,m,A[N],q[N];LL W[N],S[N],f[N][2];inline int read(){ int now=0,f=1;register char c=gc(); for(;!isdigit(c);c=gc()) if(c=='-') f=-1; for(;isdigit(c);now=now*10+c-'0',c=gc()); return now*f;}inline LL Calc_X(int x,int y){ return S[x]-S[y];}inline LL Calc_Y(int x,int y,int s){ return (f[x][s]+S[x]*S[x]-W[x])-(f[y][s]+S[y]*S[y]-W[y]);}inline LL Calc_f(int x,int y,int s){ return f[x][s]+W[y]-W[x]-S[x]*(S[y]-S[x]);}int main(){ while(n=read(),m=read(),n&&m) { S[0]=W[0]=0; for(int i=1;i<=n;++i) A[i]=read(), S[i]=S[i-1]+A[i], W[i]=W[i-1]+A[i]*S[i-1]; for(int i=1;i<=n;++i) f[i][0]=W[i]; int p=1; for(int h,t,j=1;j<=m;++j)//至多分m+1段 { h=t=1, q[1]=0;//i从0转移就是W[i] p^=1; for(int i=1;i<=n;++i) { while(h

转载于:https://www.cnblogs.com/SovietPower/p/8427630.html

你可能感兴趣的文章
js随笔-变量作用域
查看>>
随意写点
查看>>
mongodb配置文件
查看>>
iphone开发学习,iphone5页面适配修改
查看>>
Log4net如何增加自定义字段(三种方式)
查看>>
简单实用的jQuery分页插件
查看>>
一行代码实现C#的四舍五入
查看>>
[转载]unity优化1
查看>>
最新LAMP教程,玩转linux
查看>>
切片的个人理解
查看>>
大数据 hadoop 环境搭建
查看>>
jmeter正则表达式解析
查看>>
17.centos7基础学习与积累-003-命令练习01
查看>>
Air Jordan 8 Retro Performance Review
查看>>
暑假生活第八周总结
查看>>
JQuery中的siblings()是什么意思
查看>>
(转)用graph-easy描绘kubenetes描绘k8s组件逻辑图
查看>>
Uiautomator 2.0 - 实战
查看>>
thinkphp去掉index.php
查看>>
C#经典之Application.DoEvents()的使用
查看>>