Description

Input

第一行为整数L,其中4≤L≤100000,且有50%的数据满足L≤104,表示木板下侧直线段的长。第二行为L个正整数A1,A2,…,AL,其中Ai≤108

Output

仅包含一个整数D,表示为使梳子面积最大,需要从木板上挖掉的格子数。

Sample Input

9
4 4 6 5 4 2 3 3 5

Sample Output

3

HINT

初看此题,这不是一道很水很水的dp题吗,一看数据范围马上枪毙。然后就放肆想,思考一下午未果,打了一发卡决策的dp,50分果断wa。最后还是研究题解去了。
贪心我看了很久,还是不会证明,理性的想想算了——对于某个木板的最优决策,一定存在|i-j|<=1,|b[i]-a[j]|<=2(其中b[i]指剪断后的木板高,a[i]指原木板高)。假设他是对的,那么我们dp的复杂度就会降到O(kL),其中k是一个很小的常数。
我把证明发到这里(提取码:055a),如果你看懂,我也欢迎你跟我讨论一下。
代码可能与网上其他题解的雷同,很正常,因为我是copy懂的。
 
 #include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std; #define inf (1LL<<60)
#define maxn 100010
typedef long long ll;
int h[maxn],pp[maxn][],n; ll f[maxn][][],ans=inf,sum; int main()
{
freopen("1200.in","r",stdin);
freopen("1200.out","w",stdout);
scanf("%d",&n);
for (int i = ;i <= n;++i)
{
scanf("%d",h+i); sum += h[i];
for (int j = h[i] - ;j <= h[i] + ;++j)
{
pp[i][++pp[i][]] = j;
if (i-) pp[i-][++pp[i-][]] = j;
if (i-) pp[i-][++pp[i-][]] = j;
if (i + <= n) pp[i+][++pp[i+][]] = j;
if (i + <= n) pp[i+][++pp[i+][]] = j;
}
}
for (int i = ;i <= n;++i)
{
sort(pp[i]+,pp[i]+pp[i][]+);
pp[i][] = unique(pp[i]+,pp[i]+pp[i][]+)-pp[i]-;
while (pp[i][] && pp[i][pp[i][]] > h[i]) --pp[i][];
}
memset(f,,sizeof(f));
for (int i = ;i <= pp[][];++i) f[][][i] = f[][][i] = pp[][i];
for (int i = ;i <= n;++i)
for (int j = ;j <= pp[i-][];++j)
for (int k = ;k <= pp[i][];++k)
{
if (pp[i-][j]<pp[i][k])
f[i][][k] = max(f[i][][k],f[i-][][j]+pp[i][k]);
else if (pp[i-][j]>pp[i][k])
f[i][][k] = max(f[i][][k],f[i-][][j]+pp[i][k]);
else
{
f[i][][k] = max(f[i][][k],f[i-][][j]+pp[i][k]);
f[i][][k] = max(f[i][][k],f[i-][][j]+pp[i][k]);
}
}
ans = 1LL<<;
for (int p = ;p < ;++p)
for (int j = ;j <= pp[n][];++j)
ans = min(ans,sum-f[n][p][j]);
printf("%lld",ans);
fclose(stdin); fclose(stdout);
return ;
}

BZOJ 1200 木梳的更多相关文章

  1. bzoj 1200: [HNOI2005]木梳 DP

    1200: [HNOI2005]木梳 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 266  Solved: 125[Submit][Status] ...

  2. 1200: [HNOI2005]木梳 - BZOJ

    Description   Input 第一行为整数L,其中4<=L<=100000,且有50%的数据满足L<=104,表示木板下侧直线段的长.第二行为L个正整数A1,A2,…,AL ...

  3. 【BZOJ】【3530】【SDOI2014】数数

    AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...

  4. 【BZOJ】【1391】【CEOI2008】order

    网络流/最小割 暴力建图就好了……S->i 容量为收益,i->j+n 容量为租金,j+n->T容量为购买所花的钱. 如果亏钱的话那么割掉的就是收益,表示不赚钱. 如果租金大于购买所花 ...

  5. BZOJ 1391 [Ceoi2008]order

    1391: [Ceoi2008]order Description 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完 ...

  6. 【BZOJ 1119】 1119: [POI2009]SLO (置换)

    1119: [POI2009]SLO Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. bzoj 4026 dC Loves Number Theory 主席树+欧拉函数

    题目描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n)代 ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. The Six Types of Rails Association

    翻译整理自:http://guides.rubyonrails.org/v3.2.13/association_basics.html 想吐槽一句,http://guides.ruby-china.o ...

  2. Memo打印1

              Delphi 打印Memo里面的内容 实现的功能和记事本的打印的功能一样 打印保存为文件时此时的文件名如何设置? 当Memo里的文本数量巨大时 窗体正在打印会出现点数字显示问题 闪 ...

  3. ReentrantLock与synchronized的差别

    总的来说,lock更加灵活. 主要同样点:Lock能完毕synchronized所实现的全部功能 不同: 1.ReentrantLock功能性方面更全面,比方时间锁等候,可中断锁等候,锁投票等,因此更 ...

  4. Sysstat LINUX工具包址

    http://sebastien.godard.pagesperso-orange.fr/

  5. hadoop自带的writable类型

    Hadoop 中,并没有使用Java自带的基本类型类(Integer.Float等),而是使用自己开发的类.Hadoop 自带有很多序列化类型,大致分为以下两种: 实现了WritableCompara ...

  6. spring-data-redis工程

    官方文档:http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/redis.html The Spring ...

  7. Android Activity横竖屏转换的生命周期

    新创建一个Activity,用来此次测试. 先贴代码 package com.hugo.apj.activitylifetest; import android.support.v7.app.AppC ...

  8. ZOJ 3905 Cake(贪心+dp)

    动态规划题:dp[i][j]表示有i个Cake,给了Alice j个,先按照b排序,这样的话,能保证每次都能成功给Alice Cake,因为b从大到小排序,所以Alice选了j个之后,Bob最少选了j ...

  9. Ant配置

    首先去官网下载一个ant的文件 http://ant.apache.org/bindownload.cgi

  10. (转)system()函数

    [C/C++]Linux下system()函数引发的错误   今天,一个运行了近一年的程序突然挂掉了,问题定位到是system()函数出的问题,关于该函数的简单使用在我上篇文章做过介绍: http:/ ...