hdu 3507 斜率优化dp
2013-08-18 18:37
357 查看
简单的斜率优化 但是要注意数据中有0,要特殊处理一下。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=5e5+9; long long sum[maxn],dp[maxn]; int que[maxn]; bool chk1(int k,int j,int i) { return (dp[j]-dp[k]+sum[j]*sum[j]-sum[k]*sum[k])<=2*sum[i]*(sum[j]-sum[k]); } bool chk2(int k,int j,int i) { if(sum[i]==sum[j]) return true; long long a=dp[j]-dp[k]+sum[j]*sum[j]-sum[k]*sum[k]; a*=(sum[i]-sum[j]); long long b=dp[i]-dp[j]+sum[i]*sum[i]-sum[j]*sum[j]; b*=(sum[j]-sum[k]); return a>b; } int main() { freopen("in.txt","r",stdin); int n,m; while(scanf("%d %d",&n,&m)!=EOF) { sum[0]=0; for(int i=1;i<=n;i++) { scanf("%lld",&sum[i]); sum[i]+=sum[i-1]; } int front=1,end=0; que[++end]=0; dp[0]=0; for(int i=1;i<=n;i++) { while(front<end&&chk1(que[front],que[front+1],i)) front++; int j=que[front]; dp[i]=dp[j]+(sum[i]-sum[j])*(sum[i]-sum[j])+m; while(front<end&&chk2(que[end-1],que[end],i)) end--; que[++end]=i; } printf("%lld\n",dp ); } return 0; }
相关文章推荐
- hdu 3507 Print Article(dp斜率优化)
- HDU 3507 Print Article(斜率优化dp)
- HDU 3507 Print Article(斜率优化DP)
- hdu 3507 Print Article(DP+斜率优化)
- HDU-3507 Print Article DP斜率优化
- HDU 3507 DP斜率优化 解题报告
- hdu 3507 Print Article 斜率优化dp
- hdu 3507(DP+斜率优化)
- HDU 3507 Print Article 斜率优化dp
- Print Article [HDU 3507] 斜率优化DP模板
- hdu 3507 斜率优化DP
- HDU 3507 Print Article [DP斜率优化]
- HDU 3507 斜率优化dp
- HDU - 3507(斜率DP优化)
- hdu 3507 斜率优化dp
- HDU 3507 Print Article【斜率优化dp】
- 斜率dp优化两题(poj 3709 hdu 3507)
- 文章标题 HDU 3507 :Print Article (斜率dp优化)
- hdu 3507 斜率dp优化
- HDU 3507 Print Article 斜率优化DP