题目

假设葱一共有 nnn 棵,第 iii 棵葱的高度为 a[i]a[i]a[i]。

Alice 一共要割最多 kkk 刀葱,每刀可以在某一高度割去连续一段葱。

以高度 hhh 在区间 [l,r][l, r ][l,r] 割一刀葱是合法的,当且仅当区间里的葱的高度都不小于 hhh,此时,这个区间中的葱小于等于 hhh 的未被割的部分都会被割掉。

下面的葱被割掉以后,上面的葱不会掉下来。

请问,kkk 刀以后,割掉的葱的总长度的最大值是多少?

数据范围

测试点 nnn kkk a[i]a[i]a[i]
1−41-41−4 ≤5\le 5≤5 ≤5\le 5≤5 ≤106\le 10^6≤106
5−85-85−8 ≤10\le 10≤10 ≤10\le 10≤10 ≤106\le 10^6≤106
9−109-109−10 ≤100\le 100≤100 ≤2\le 2≤2 ≤106\le 10^6≤106
11−1211-1211−12 ≤100\le 100≤100 ≤100\le 100≤100 ≤100\le 100≤100
13−2013-2013−20 ≤100\le 100≤100 ≤100\le 100≤100 ≤106\le 10^6≤106

对于所有数据,1≤n,k≤100,1≤ai≤1061 \le n,k \le 100,1 \le a_i \le 10^61≤n,k≤100,1≤ai​≤106。

题解

我们考虑到一段连续的区间,切掉最小值之后分为2个区间,这样到最后最多只有4n个区间。所以我们令 f[i][k][l]f[i][k][l]f[i][k][l] 表示第 iii 个区间上一刀割在 lll 高度,割了 kkk 刀之后的最大价值。于是我们就可以转移。令 x,yx,yx,y 为 iii 的子区间。
若当前这一刀不割区间最小值,则 f[i][k][l]f[i][k][l]f[i][k][l] 可以由 f[x][k1][l],f[y][k−k1][l]f[x][k1][l],f[y][k-k1][l]f[x][k1][l],f[y][k−k1][l]转移。
若割了最小值,令区间最小值为o,则由 f[x][k1][o],f[y][k−k1−1][o]f[x][k1][o],f[y][k-k1-1][o]f[x][k1][o],f[y][k−k1−1][o]转移。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,k,a[N],f[N*4][N][N],qu[N][N],tot,ans,hi[N*4];
void solve(int l,int r,int h){qu[l][r]=++tot;int p=0;for(int i=l;i<=r;++i)if(a[p]>a[i])p=i;hi[h]=a[p];if(p>l)solve(l,p-1,h+1);if(p<r)solve(p+1,r,h+1);int lt=qu[l][p-1],rt=qu[p+1][r];for(int i=0;i<=k;++i){for(int j=0;j<=h;++j){for(int ck=0;ck<=i;++ck)f[qu[l][r]][i][j]=max(f[qu[l][r]][i][j],f[lt][ck][j]+f[rt][i-ck][j]);for(int ck=0;ck<i;++ck)f[qu[l][r]][i][j]=max(f[qu[l][r]][i][j],f[lt][ck][h]+f[rt][i-ck-1][h]+(r-l+1)*(hi[h]-hi[j]));}}
}
int main(){
//  freopen("test.in","r",stdin);
//  freopen("test.out","w",stdout);scanf("%d%d",&n,&k);a[0]=1e9;for(int i=1;i<=n;++i)scanf("%d",&a[i]);solve(1,n,1);printf("%d\n",f[qu[1][n]][k][0]); return 0;
}

DTOJ #5274. 割葱相关推荐

  1. 2019 CCPC-Wannafly Winter Camp Div2 Day1

    补题进度 7/11 J 夺宝奇兵 范围较小,直接枚举靠多少票赢即可,不够的票从小到大买 #include<bits/stdc++.h> #define ll long long const ...

  2. 2009.09.30 随想

    仇恨者比被仇恨者要痛苦得多! 而世仇列是如此--被仇恨者早忘记了, 而仇恨者仍然被仇恨抓住, 犹如难产的妇人, 痛苦的贵妇. 无论你如何尊贵强壮, 你始终是痛苦的, 因为仇恨抓住你, 成为了你的主. ...

  3. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)(补题记录)

    一篇来自ACM入门者的补题记录 文章目录 A.机器人 B.吃豆豆 C.拆拆拆数 E.流流流动 F.爬爬爬山 I.起起落落 J.夺宝奇兵 A.机器人 题意:有两条平行线段A,B,长度从1~n,机器人一开 ...

  4. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  5. lintcode-136-分割回文串

    136-分割回文串 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 样例 给出 s = "aab",返回 [ ["aa&q ...

  6. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  7. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  8. 普元王葱权:数字化时代需要新一代的大数据应用平台架构

    记者 | 杨丽 出品 | AI 科技大本营(rgznai100) 2018 年 12 月 6 日,北京新云南皇冠假日酒店,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN.中科天玑数据科技 ...

  9. 实战|基于图割算法的木材表面缺陷图像分析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 鉴于图割方法的明显优势,白雪冰及其团队采用G ...

最新文章

  1. 十分钟了解分布式计算:GraphX
  2. 即时通讯 TCP UDP
  3. 计算机专业课题 结题报告,计算机结题报告 - 结题报告 - 书业网.doc
  4. Flex4与WebService通信
  5. tyvj1068 STR
  6. 如何从文件系统中读取文件内容
  7. 为单个Web应用程序配置多个上下文根– JBoss
  8. Kubernetes入门培训(内含PPT)-(转)
  9. web 页面table 斜线效果 跨越多行和 多列
  10. Myeclipse 8.5 注册码
  11. 使用HttpURLConnection+AsyncTask访问webservice接口(返回json字符串)
  12. 使用管理员权限运行的程序无法浏览网络驱动器的问题
  13. 有效需求预测的四大优势
  14. 无线Mesh网络技术及其应用
  15. oracle全局索引改成本地索引,解析一个通过添加本地分区索引提高SQL性能的案例...
  16. 用电脑搭建视频会议系统的方法
  17. 投资效率模型两个版本(含stata代码以及计算参考文献)
  18. 手机端linux虚拟机,教你如何用「UTM虚拟机」让苹果手机运行Windows/安卓/Linux系统...
  19. 基于深度学习的图像识别模型发展
  20. 正态分布的前世今生——如何发现的?

热门文章

  1. java 透明对话框_java实现jframe透明窗体示例
  2. mysql关键字 exists 与 in
  3. PalmOS开发教程-8
  4. SQL 查找满足多个查询条件的行
  5. Security翻译
  6. 计算机学院运动会解说词,学院运动会解说词
  7. KeyListener
  8. 实现基于国密SM3的密钥派生(KDF)功能
  9. Generative Image Inpainting with Adversarial Edge Learning— 环境搭建—详细教程 ——附源码| 【ICCV 2019】
  10. 今日感悟——11.2