叶子合并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. 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...

  2. Ch07 包和引入 - 练习

    1. 编写示例程序,展示为什么  package com.horstmann.impatient  不同于 package com package horstmann package impatien ...

  3. Jsoup解析XML

    先导入jsoup.jar  包 方法1:不推荐,了解即可 方法 方法3: 后期学习主流

  4. python迭代-如何在一个for语句中迭代多个可迭代对象

    如何在一个for语句中迭代多个可迭代对象 问题举例 (1)某班学生期末考试成绩,语文,数学,英语分别存储在3个列表中,同时迭代三个列表,计算每个学生的总分 (2)某年级有4个班,某次考试每班英语成绩分 ...

  5. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(二)

    接着第一篇的写: 第三步,测试SQL Server数据库的性能: a.加载JDBC SQL Server驱动.添加线程组和设置线程属性和第二步一样,就不再赘述了: b.设置JDBC Connectio ...

  6. 60.Vue:将px转化为rem,适配移动端

    1.下载lib-flexible 我使用的是vue-cli+webpack,所以是通过npm来安装的 npm i lib-flexible --save 2.引入lib-flexible 在main. ...

  7. CSS常见兼容问题以及解决办法

    浏览器的兼容性问题,通常是因为不同的浏览器对同一段代码有不同的解析,造成页面显示不统一的情况. 这里谈到的浏览器,主要指IE6/IE7/IE... FireFox Chrome Opera Safar ...

  8. Python之socket_udp

    UDP服务端&客户端编程 ''' udp编程 创建socket对象,socket.SOCK_DGRAM 绑定ip和port,bind()方法 传输数据 1.接收数据,socket.recvfr ...

  9. Shrinking images on Linux

    When creating images from existing ISOs you often need to allocate a number of MB for the image to a ...

  10. cookie和sission的原理及异同

    Cookie Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持. 通常有三个步骤来识别回头客: 服务器脚本发送 ...