叶子合并leaves

Description

在一个美丽的秋天,丽丽每天都经过的花园小巷落满了树叶,她决定把树叶堆成K堆,小巷是笔直的 共有N片树叶(树叶排列也是笔直的),每片树叶都有一个重量值,并且每两片想邻的树叶之间的距离都是1 现把所有的树叶按从左到右的顺序进行编号,编号为1..N。丽丽移动每片树叶所消耗能量等于这片树叶的重量 乘以移动的距离,丽丽决定分K天完成,每天堆一堆,并且规定只能把树叶往左移动,因为丽丽每天都是从右往左 经过小巷的。求丽丽完成任务所消耗的最少能量。

Input

输入的第一行为两个用空格隔开的正整数N和K。后面有N行 每行一个正整数表示叶子的重量(第i+1行表示第i片树叶的重量)

Output

输出为一个整数,表示把树叶堆成K堆所消耗的最少体力。

Sample Input 1

5 2

1

2

3

4

5

Sample Output 1

13

Hint

N在(0,1001)

K在(0,11)

每片树叶的重量(0,1001)

思路:

前缀和: pre[i] 前i个叶子的重量和

预处理:sum[i][j] 前i个叶子移动到第j个位置的总花费

dp递推: dp[i][j] 前i个叶子分成k堆的最小值 == min(前j个分成一堆 + j~i个分成的一堆 共k(k~K)堆)的最小值i和j

AC代码:

#include<bits/stdc++.h>
using namespace std; /*
前缀和: pre[i] 前i个叶子的重量和
预处理:sum[i][j] 前i个叶子移动到第j个位置的总花费
dp递推: dp[i][j] 前i个叶子分成k堆的最小值 == min(前j个分成一堆 + j~i个分成的一堆 共k(k~K)堆)的最小值i和j
*/ const int maxn = 1010;
int n,K;
int a[maxn];
int pre[maxn];
int sum[maxn][maxn];
int dp[maxn][maxn]; int main(){
scanf("%d%d",&n,&K);
for(int i=n;i>=1;i--){ //从右往左输入以便后面正序遍历
scanf("%d",&a[i]);
}
pre[0] = 0;
for(int i=1;i<=n;i++){
pre[i] = pre[i-1] + a[i];//前缀和
}
//预处理sum[i][j]
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(i==j) sum[i][j] = sum[i-1][j-1] + pre[i-1];//当i == j,等于 前i-1个叶子(加上第i个叶子也一样 但是j>i的 所以分类讨论递推式)移动到j-1个位置的消耗 + 前i-1个叶子一起移动到第j个位置(前缀和pre[i-1])
else sum[i][j] = sum[i][j-1] + pre[i];//等于 前i-1个叶子移动到j-1个位置的消耗 + 前i个叶子一起移动到第j个位置(前缀和pre[i])
}
}
//初始化dp
memset(dp,0x3f3f3f3f,sizeof(dp));
for(int i=1;i<=n;i++) dp[i][1] = sum[i][i]; //只能分成j==1堆时,dp[i][j]等于把前i堆移动到最后的i个叶子上(sum[i][i]) for(int k=2;k<=K;k++){//分成k堆
for(int i=1;i<=n;i++){//前i个,到n
for(int j=1;j<i;j++){//j堆,最多到i堆
dp[i][k] = min(dp[i][k],dp[j][k-1] + sum[i][i] - sum[j][i]);//状态转移方程: 前i个分成k堆 等于 min(前j个分成k-1堆 加上 第j+1~第i个分成另外一堆)的最小花费
}
}
}
printf("%d\n",dp[n][K]);
return 0;
}

BZOJ-1587|前缀和 预处理 dp||叶子合并leaves的更多相关文章

  1. BZOJ 1587: 叶子合并leaves

    题目大意:求n个数分成k段的最小代价. 题解:DP,没什么好说的. 代码: #include<cstdio> #include<algorithm> using namespa ...

  2. [BZOJ1587]叶子合并leaves

    Description 在一个美丽的秋天,丽丽每天都经过的花园小巷落满了树叶,她决定把树叶堆成K堆,小巷是笔直的 共有N片树叶(树叶排列也是笔直的),每片树叶都有一个重量值,并且每两片想邻的树叶之间的 ...

  3. HDU 5550 - Game Rooms(DP + 前缀和预处理)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意: 一个大楼有n(2≤n≤4000)层,每层可以建一个乒乓球房或者一个游泳房,且每种房间在大楼 ...

  4. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  5. LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP

    题目:https://loj.ac/problem/6089 对于 i <= √n ,设 f[i][j] 表示前 i 种,体积为 j 的方案数,那么 f[i][j] = ∑(1 <= k ...

  6. Bzoj 1131[POI2008]STA-Station (树形DP)

    Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...

  7. BZOJ 3167 [Heoi2013]Sao ——树形DP

    BZOJ4824的强化版. 改变枚举的方案,使用前缀和进行DP优化. 然后复杂度就是$O(n^2)$了. #include <map> #include <cmath> #in ...

  8. [luoguP1666] 前缀单词(DP)

    传送门 先把所有字符串按照字典序排序一下 会发现有字符串x和y(x再y前面,即字典序小),如果x不是y的前缀,那么在x前面不是x前缀的字符串也不是y的前缀 这样就可以DP了 f[i][j]表示前i个字 ...

  9. [BZOJ 4332] [JSOI2012]分零食(DP+FFT)

    [BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...

随机推荐

  1. java中使用springmvc实现下载文件

    下载文件具体实现代码: public class TestDownload{ public HttpServletRequest request; public HttpServletResponse ...

  2. js中hash、hashchange事件

    1.hash即URL中"#"字符后面的部分. ①使用浏览器访问网页时,如果网页URL中带有hash,页面就会定位到id(或name)与hash值一样的元素的位置: ②hash还有另 ...

  3. 接口测试工具-poster

    1.发包工具-火狐浏览器插件 安装:打开火狐浏览器-alt键-工具-附加组件-搜索poster-点击安装-重启火狐浏览器-打开工具下的poster 2.使用 1)GET 1.输入URL 2.填入参数 ...

  4. 67.web--手机端兼容性问题

    H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-width,initia ...

  5. Openrasp源码分析

    Openrasp是百度关于rasp技术的开源项目,由于工作需要,之前对rasp的源码进行了简单的分析.文章是之前就写好的,现在放出了,希望对大家有写帮助. OpenRASP中java引擎的源码分析 安 ...

  6. 解决页面使用ifrmae后,在session失效后登录页面在子页面中显示(子窗体出现父窗体)

    在登录页面中添加js判断当前页面是否是父页面,诺不是则父页面跳转至登录页面. <script type="text/javascript"> //解决登录后多个父窗体问 ...

  7. JDK8 HashMap--removeNode()移除节点方法

    /*删除节点*/ final Node<K,V> removeNode(int hash, Object key, Object value, boolean matchValue, bo ...

  8. MVC-Razor视图

    Razor 视图引擎 与Aspx开发区别在于代码: 1.Razor 更智能,摒弃了<%%>格式,直接用@符号开启cs代码,遇到html时自动识别 2.遇到如汉字等即非cs代码,又非html ...

  9. Python中__init__()和self的有啥用

    这篇博客让我一下子就理解了,https://www.cnblogs.com/illusion1010/p/9527034.html,感谢博主 由于类可以起到模板的作用,因此,可以在创建实例的时候,把一 ...

  10. java集合的三种遍历方式

    import java.util.ArrayList;  import java.util.Collection;import java.util.Iterator;public class Home ...