hud 3507,Print Article,斜率优化dp
Problem - 3507 (hdu.edu.cn)
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 26705 Accepted Submission(s): 8024
Problem Description
Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and tear, so Zero use a cost to evaluate this degree.
One day Zero want to print an article which has N words, and each word i has a cost Ci to be printed. Also, Zero know that print k words in one line will cost
M is a const number.
Now Zero want to know the minimum cost in order to arrange the article perfectly.
One day Zero want to print an article which has N words, and each word i has a cost Ci to be printed. Also, Zero know that print k words in one line will cost
M is a const number.
Now Zero want to know the minimum cost in order to arrange the article perfectly.
Input
There are many test cases. For each test case, There are two numbers N and M in the first line (0 ≤ n ≤ 500000, 0 ≤ M ≤ 1000). Then, there are N numbers in the next 2 to N + 1 lines. Input are terminated by EOF.
Output
A single number, meaning the mininum cost to print the article.
Sample Input
5 5
5
9
5
7
5
Sample Output
230
Author
Xnozero
Source
解析:斜率优化dp
HDU3507 Print Article —— 斜率优化DP - h_z_cong - 博客园 (cnblogs.com)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
using namespace std;
typedef long long LL;
const int N = 5e5 + 5;
int n, m;
LL c[N], f[N],q[N];
LL getup(int j, int k) {
return f[j] + c[j] * c[j] - (f[k] + c[k] * c[k]);
}
LL getdown(int j, int k) {
return 2 * (c[j] - c[k]);
}
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%d", &c[i]);
c[i] += c[i - 1];
}
f[0] = 0;
int hh = 0, tt = 0;
q[0] = 0;
for (int i = 1; i <= n; i++) {
while (hh < tt && getup(q[hh + 1], q[hh]) < getdown(q[hh + 1],q[ hh]) * c[i])hh++;
int j = q[hh];
f[i] = f[j] + (c[i] - c[j]) * (c[i] - c[j]) + m;
while (hh < tt && getup(i, q[tt]) * getdown(q[tt], q[tt - 1]) <= getup(q[tt], q[tt - 1]) * getdown(i, q[tt]))tt--;
q[++tt] = i;
}
printf("%d\n", f[n]);
}
return 0;
}
分类:
dp / # 斜率优化dp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】