BZOJ4709 JSOI2011柠檬(动态规划)
2024-09-22 14:24:46
首先要冷静下来发现这仅仅是在划分区间。显然若有相邻的数字相同应当划分在同一区间。还有一个显然的性质是区间的两端点应该相同且选择的就是端点的数。瞬间暴力dp就变成常数极小100002了。可以继续斜率优化然而懒了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,a[N],b[N],cnt[N],p[N],pre[N];
ll f[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4709.in","r",stdin);
freopen("bzoj4709.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=n;i++)
{
int t=i;
while (t<n&&a[t+]==a[i]) t++;
m++,b[m]=a[i],cnt[m]=t-i+,pre[m]=p[a[i]],p[a[i]]=m;
i=t;
}
for (int i=;i<=m;i++)
{
int s=;
for (int j=i;j;j=pre[j])
{
s+=cnt[j];
f[i]=max(f[i],f[j-]+1ll*b[i]*s*s);
}
}
cout<<f[m];
return ;
}
最新文章
- Web API后端调用接口 (Get,POST,Put,Delete)
- Product Backlog
- Java多线程之Lock的使用
- DOS常用的简单命令
- android开发软件
- IGF职业组比赛
- Guangsoushensou 2
- python学习之路-4 内置函数和装饰器
- java菜鸟篇<;四>; ZTree入门篇
- windows7下virtualBox配置识别usb
- C# 中 双问号??的用法
- redis五种数据类型
- javascript中this的指向
- c/c++ 大于等于 大于 时间效率比较
- Tippy.js – 轻量的 Javascript Tooltip 工具库
- wordpress如何去掉generator
- opengl 结果白屏解决方法
- 安装scrapy时遇到的问题
- 28、shareSDK分享以及 QQ应用平台申请遇到的问题
- PDFSharp生成PDF.