HDOJ 3507 Print Article
来源:互联网 发布:淘宝怎么取消国际转运 编辑:程序博客网 时间:2024/05/10 12:54
斜率优化DP
Print Article
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 5519 Accepted Submission(s): 1707
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 559575
Sample Output
230
Author
Xnozero
Source
2010 ACM-ICPC Multi-University Training Contest(7)——Host by HIT
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=500500;int n;int q[maxn],head,tail;int dp[maxn],sum[maxn],M;int main(){ while(scanf("%d%d",&n,&M)!=EOF) { head=0,tail=0,dp[0]=0,sum[0]=0; q[tail++]=0; for(int i=1;i<=n;i++) { scanf("%d",sum+i); sum[i]+=sum[i-1]; } for(int i=1;i<=n;i++) { while(head+1<tail) { int p1=q[head]; int p2=q[head+1]; int x1=dp[p1]+sum[p1]*sum[p1]; int x2=dp[p2]+sum[p2]*sum[p2]; int y1=sum[p1]; int y2=sum[p2]; if( (x2-x1) <= (y2-y1) * 2 * sum[i] ) head++; else break; } int k=q[head]; dp[i]=dp[k]+(sum[i]-sum[k])*(sum[i]-sum[k])+M; while(head+1<tail) { int p1=q[tail-2]; int p2=q[tail-1]; int p3=i; int x1=dp[p1]+sum[p1]*sum[p1]; int x2=dp[p2]+sum[p2]*sum[p2]; int x3=dp[p3]+sum[p3]*sum[p3]; int y1=sum[p1],y2=sum[p2],y3=sum[p3]; if((x3-x2)*(y2-y1)<=(x2-x1)*(y3-y2)) tail--; else break; } q[tail++]=i; } printf("%d\n",dp[n]); } return 0;}
0 0
- HDOJ 3507 Print Article
- hdoj 3507 Print Article
- 【DP】 HDOJ 3507 Print Article
- HDOJ 3507 Print Article (斜率DP)
- HDOJ-3507 Print Article (斜率优化dp)
- HDOJ 3507 Print Article (斜率优化DP)
- hdu-3507-Print Article
- hdu 3507 Print Article
- hdu 3507 Print Article
- HDU 3507 Print Article
- 【HDU 3507】 Print Article
- hdu 3507Print Article
- hdu-3507 Print Article
- HDU 3507 Print Article
- HDU 3507 Print Article
- HDU 3507 Print Article
- Print Article[HDU 3507]
- HDU 3507 Print Article
- 分段和分页
- 支付、清算和结算含义
- Android eclipse 程序调试以及快捷键的使用
- 重构机房组合查询之学生基本信息查询
- int char string CString类型转换
- HDOJ 3507 Print Article
- 用例图的泛化、扩展和包含
- 用Comparator对List<Map>进行排序
- Android杂谈--ListView之BaseAdapter的使用
- NOJ1110奇数排序——超时,看写法,需要较灵活的思维!
- hdu-oj 1200 To and Fro
- uva 10808 - Rational Resistors(基尔霍夫定律+高斯消元)
- hibernate proxool 配置
- 数据存储之SharedPreferences