hdu 4258 斜率DP
2024-10-20 18:56:57
思路:dp[i]=dp[j]+(num[i]-num[j+1])^2;
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define Maxn 1000010
#define LL unsigned __int64
using namespace std;
LL dp[Maxn],num[Maxn];
int que[Maxn*];
inline int ReadInt()
{
char ch = getchar();
int data = ;
while (ch < '' || ch > '')
ch = getchar();
do
{
data = data* + ch-'';
ch = getchar();
} while (ch >= '' && ch <= '');
return data;
}
int main()
{
int n,i,j;
LL c;
while(scanf("%d%I64u",&n,&c)!=EOF,n||c){
memset(dp,,sizeof(dp));
for(i=;i<=n;i++)
num[i]=(LL)ReadInt();
int head,rear;
head=;rear=;
que[++rear]=;
dp[]=;
for(i=;i<=n;i++){
while(head<rear&&(dp[que[head+]]+num[que[head+]+]*num[que[head+]+]-(dp[que[head]]+num[que[head]+]*num[que[head]+])<=*num[i]*(num[que[head+]+]-num[que[head]+])))
head++;
dp[i]=dp[que[head]]+(num[i]-num[que[head]+])*(num[i]-num[que[head]+])+c;
while(head<rear&&(dp[i]+num[i+]*num[i+]-(dp[que[rear]]+num[que[rear]+]*num[que[rear]+]))*(num[que[rear]+]-num[que[rear-]+])<=(dp[que[rear]]+num[que[rear]+]*num[que[rear]+]-(dp[que[rear-]]+num[que[rear-]+]*num[que[rear-]+]))*(num[i+]-num[que[rear]+]))
rear--;
que[++rear]=i;
}
printf("%I64u\n",dp[n]);
}
return ;
}
最新文章
- TSQL 分组集(Grouping Sets)
- mysql datetime查询异常
- PHP基础知识之————php5-cli 的安装以及phpredis的安装
- 搭建自己的ngrok服务
- 前端JS开发框架-DHTMLX
- 怎样让HTML5调用手机摄像头拍照——实践就是一切
- 解决phpmailer可以在windows下面发送成功, 在linux下面失败的问题
- 【Egret】Lakeshore 使用中的一些疑难解决技巧!
- 游戏UI框架设计(五): 配置管理与应用
- Java 逆变与协变的名词说明
- EmEditor编辑器正则表达式的优点
- 软件工程HW1-四则运算软件
- Swing-选项卡面板JTabbedPane-入门
- js对象数组(JSON) 根据某个共同字段 分组
- u3d常用代码小集合
- ES6 export
- linux lftp
- MVC的BundleConfig应用
- Docker 快速入门教程
- Loj#6434「PKUSC2018」主斗地(搜索)