博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3507 Print Article (斜率优化)
阅读量:4510 次
发布时间:2019-06-08

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

HDU 3507 Print Article (斜率优化)

ACM

题目地址: 

题意: 

给定一个长度为n的序列。和一个常数m,我们能够将序列分成任意段,每段的权值为sum(arr[i]) + C(x<=i<=y),求一种划分方法使得整个序列的权值最小

分析: 

from:

f[i]=min(f[k]+(sum(i)-sum(k))^2 )+m 

= f[k]+sum^2(i)+sum^2(k)-2*sum(i)*sum(k)+m. 
也就是找一个最小的f[k]+sum^2(k)-2*sum(i)*sum(k),假设k优于j,必有(f[k]+sum^2(k)-f[j]-sum^2(j))/(2*sum(k)-2*sum(j))<=s[i].

代码

/**  Author:      illuz 
* File: 3507.cpp* Create Date: 2014-09-19 10:19:57* Descripton: dp*/#include
#include
#include
#include
using namespace std;#define repf(i,a,b) for(int i=(a);i<=(b);i++)typedef long long ll;const int N = 5e6 + 10;int n, m, l, r, q[N];ll s[N], x[N], y[N], k[N];void init() { int x; repf (i, 1, n) { cin >> x; s[i] = s[i - 1] + x; k[i] = s[i] * 2; }}inline bool check(int a, int b, int c) { return (y[a] - y[b]) * (k[b] - k[c]) <= (y[b] - y[c]) * (k[a] - k[b]);}void solve() { q[0] = l = r = 0; repf (i, 1, n) { while (l < r && (y[q[l+1]]-y[q[l]]) <= s[i] * (k[q[l+1]]-k[q[l]])) l++; x[i] = x[q[l]] + (s[i] - s[q[l]]) * (s[i] - s[q[l]]) + m; y[i] = x[i] + s[i] * s[i]; while (l < r && check(i, q[r], q[r-1])) r--; q[++r] = i; } cout << x[n] << endl;}int main() { ios_base::sync_with_stdio(0); while (cin >> n >> m) { init(); solve(); } return 0;}

转载于:https://www.cnblogs.com/wzzkaifa/p/6936687.html

你可能感兴趣的文章
HTTP的请求方法OPTIONS
查看>>
eclipse IDE usage of my own and tutorials link list
查看>>
五笔学习早期笔记
查看>>
LeetCode #24 Swap Nodes in Pairs
查看>>
基于WPF系统框架设计(3)-Fluent Ribbon界面布局
查看>>
Photoshop 使用曲线
查看>>
修改表中字段时发生错误
查看>>
YARN的笔记
查看>>
和我一起学习爬虫之爬虫原理和网站基本知识
查看>>
linux内核学习——内存管理
查看>>
SharpDevelop研究笔记
查看>>
php bom \ufeff
查看>>
UWP 使用Windows.Web.Http命名空间下的HttpClient使用post方法,上传图片服务器
查看>>
Docker系列05—Docker 存储卷详解
查看>>
Python基础之内置函数
查看>>
Merge Two Sorted Lists_LeetCode
查看>>
docker使用1
查看>>
public private protected default
查看>>
Python 爬取网页中JavaScript动态添加的内容(一)
查看>>
熟悉常用的HBase操作
查看>>