http://acm.hdu.edu.cn/showproblem.php?pid=2829

题意:将长度为n的序列分成p+1块,使得$\sum_{每块}\sum_{i<j} a[i]a[j]$最小(n<=1000,1<=a[i]<=100)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
const int N=10005;
typedef long long ll;
ll d[2][N], s1[N], s2[N];
int n, p, x[N], s[2][N];
inline ll sqr(ll a) { return a*a; }
inline ll w(int l, int r) { return (sqr(s1[r]-s1[l-1])-(s2[r]-s2[l-1]))>>1; }
int main() {
while(scanf("%d%d", &n, &p), !(n==0&&p==0)) {
++p;
for(int i=1; i<=n; ++i) scanf("%d", &x[i]), s1[i]=s1[i-1]+x[i], s2[i]=s2[i-1]+sqr(x[i]);
int h=0, t=1;
for(int i=2; i<=n; ++i) d[h][i]=w(1, i), s[h][i]=1;
for(int i=2; i<=p; ++i) {
s[t][n+1]=n;
for(int j=n; j>=1; --j) {
int l=s[h][j], r=s[t][j+1], &pos=s[t][j]; ll &now=d[t][j];
now=~0ull>>1;
for(int k=l; k<=r; ++k) {
ll t=d[h][k-1]+w(k, j);
if(now>=t) now=t, pos=k;
}
}
swap(t, h);
}
printf("%lld\n", d[h][n]);
}
return 0;
}

  

设$d(i, j)$表示分$i$份前$j$个的最小代价,容易得到

$$d(i, j) = min \{ d(i-1, k-1) + w(k, j) \}, i<j $$

其中

$$w(i, j) = \frac{sum1(i, j)^2-sum2(i, j)}{-2}$$

其中$sum1(i, j)=\sum_{i}^{j} a[i], sum2(i, j)=\sum_{i}^{j} a[i]^2$

(可以由$(\sum_{i} a[i] )^2 = \sum_{i} a[i]^2 - 2 \sum_{i<j} a[i]a[j]$得到= =,然后$O(n)$求出来,虽然你们都是用$O(n^2)$预处理的= =(我有常数强迫症= =))

证明挺好证的(这里只证明$w$的四边形不等式,剩下证明与前面两题相同= =我就不证明了= =

证明四边形不等式即证明当$j$固定时,$w(i, j+1)-w(i, j)$是关于$i$的递减函数

$$
\begin{align}
& w(i, j+1)-w(i, j) \notag \\
= & \frac{sum1(i, j+1)^2-sum2(i, j+1)}{-2} - \frac{sum1(i, j)^2-sum2(i, j)}{-2} \\
= & \frac{sum1(i, j+1)^2 - sum1(i, j)^2 + sum2(i, j) - sum2(i, j+1)}{-2} \\
= & \frac{a[j+1]^2 - 2a[j+1]\sum_{k=i}^{j} a[k] - a[j+1]^2}{-2} \\
= & a[j+1]\sum_{k=i}^{j} a[k]
\end{align}
$$

当j不变时i递增,显然式子减小,得证。

【HDU】2829 Lawrence的更多相关文章

  1. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  2. 【HDU】2191 多重背包问题

    原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...

  3. 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交

    [题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...

  4. 【HDU】6148 Valley Numer 数位DP

    [算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...

  5. 【HDU】5269 ZYB loves Xor I

    [算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...

  6. 【HDU】3068 最长回文

    [算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...

  7. 【HDU】2222 Keywords Search

    [算法]AC自动机 [题解]本题注意题意是多少关键字能匹配而不是能匹配多少次,以及可能有重复单词. 询问时AC自动机与KMP最大的区别是因为建立了trie,所以对于目标串T与自动机串是否匹配只需要直接 ...

  8. 【HDU】6012 Lotus and Horticulture (BC#91 T2)

    [算法]离散化 [题解] 答案一定存在于区间的左右端点.与区间左右端点距离0.5的点上 于是把所有坐标扩大一倍,排序(即离散化). 让某个点的前缀和表示该点的答案. 初始sum=∑c[i] 在l[i] ...

  9. 【HDU】6146 Pokémon GO

    [题意]一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通.n<=10000,T<=100. [算法]递推,DP [题解]原题链接:蓝桥杯 格子刷油漆 ...

随机推荐

  1. python threading编程中的LOCK和RLOCK(可重入锁)

    找到一本PYTHON并发编辑的书, 弄弄.. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time sh ...

  2. blender源代码编译

    blender源码路径(svn):https://svn.blender.org/svnroot/bf-blender/trunk/blender/ 依赖外部Lib(svn):https://svn. ...

  3. C++ 内联函数笔记

    要使用内联函数,必须采取下述措施之一: +在函数声明前加上关键字inline: +在函数定义前加上关键字inline. 通常的做法是省略原型,将整个定义(即函数头和所有函数代码)放在本应提供原型的地方 ...

  4. SOA 架构中的ESB是更好的应用于异构系统集成整合还是用于统一服务调用/基础服务实施

    一.讨论主题与观点 写一篇文章.发现一次自觉得有意思的SOA架构方面的讨论,源于昨天AgileEAS.NET SOA 平台群(113723486)里几个群友的一次关于ESB的一次讨论. 大家的讨论观点 ...

  5. mathematica练习程序(图像取反)

    代码很简单,就四行,我想到可以用mathematica干点什么了. 有人通过mathematica编程研究过视频编解码算法么,挺有意思,可以尝试一下. img=Import["f:/lena ...

  6. FZU Problem 2082 过路费 树链剖分

    Problem 2082 过路费    Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...

  7. unable to access android sdk add-on list

    在bin\properties里添加disable.android.first.run=true

  8. 已解决:Strict Standards: Non-static method cls_image::gd_version() should not be called statically in...

    在安装Ecshop的时候,遇到两个⚠️问题: Strict Standards: Non-static method cls_image::gd_version() should not be cal ...

  9. c++11 正则表达式基本使用

    c++ 11 正则表达式 常用的方法 regex_match regex_search regex_replace 等. regex_match 要求正则表达式必须与模式串完全匹配,例如: strin ...

  10. JavaScript模拟函数重载

    JavaScript是没有函数重载的,但是我们可以通过其他方法来模拟函数重载,如下所示: <!DOCTYPE html> <html> <head> <met ...