8597 石子划分问题

时间限制:500MS  内存限制:1000K
提交次数:155 通过次数:53

题型: 编程题   语言: G++;GCC;VC

Description

给定n个石子,其重量分别为a1,a2,a3,...,an。
要求将其划分为m份,每一份的划分费用定义为这份石子中最大重量与最小重量差的平方。
总划分费用为m份划分费用之和。现在对于给定的n个石子,求一种划分方案,使得总划分费用最小。

输入格式

第一行两个正整数n和m,接下来一行有n个正整数,表示一个石子的重量ai。(1≤n, m, ai≤1000)

输出格式

计算输出最小总划分费用。注意:若一份只有一个石子,那么,这份石子中最大重量与最小重量的差的平方为0。

输入样例

4 2
4 7 10 1

输出样例

18

提示

1,先将石子重量从小到大排序(从大到小也可以).
2,假设f(n,m)表示:n个石头分成m份的最小费用. 特别的,有f(1,1)=0; f(n,1)=(an - a1)^2
那么,除去最后一份石头的若干个,前面m-1份必定也是最优的分法.
若最后一堆1个石头, f(n,m) = f(n-1,m-1)+0^2
若最后一堆2个石头, f(n,m) = f(n-2,m-1)+(an - an-1)^2
若最后一堆3个石头, f(n,m) = f(n-3,m-1)+(an - an-2)^2
......
最后一堆最多只能有n-m+1个石头,因为当最后一堆为n-m+1时,前面m-1堆已经是一个一份了.
因此, f(n,m) = Min{ f(n-1,m-1)+0^2,  f(n-2,m-1)+(an - an-1)^2,  ...}例如:
n=5, m=2
a[1..5] = 1 3 4 8 9
f(5,2)=Min{ f(4,1)+0; f(3,1)+1; f(2,1)+5^2 }=Min{49,10,29}=10
这5个石头分2堆的最优分法:(1 3 4)(8 9)

这题需要记录,做的时候居然又忘记了。

首先贪心,排序后,相邻的排在一堆是必然的。

然后每次只考虑最后一堆即可是吧,其他的递归处理。

所以,设dp[i][j]表示前i个数字,分成j堆的最小值。

那么,考虑最后一堆,肯定是min(dp[1...i-1][j-1]   +   pow(a[n] - a[n - i + 1], 2));

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;#include <iostream>
#include <sstream>
const int maxn = 1e3 + 20;
int dp[maxn][maxn];
int a[maxn];
int dfs(int n, int m) {if (m == 1) return (a[n] - a[1]) * (a[n] - a[1]);if (n == m) return 0;if (dp[n][m]) return dp[n][m];int ans = 1e9;for (int i = 1; i <= n - m + 1; ++i) {ans = min(ans, dfs(n - i, m - 1) + (a[n] - a[n - i + 1]) * (a[n] - a[n - i + 1]));}return dp[n][m] = ans;
}void work() {int n, m;cin >> n >> m;for (int i = 1; i <= n; ++i) cin >> a[i];sort(a + 1, a + 1 + n);cout << dfs(n, m) << endl;
}int main() {
#ifdef localfreopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endifwork();return 0;
}

View Code

作者

zhengchan

转载于:https://www.cnblogs.com/liuweimingcprogram/p/8262163.html

8597 石子划分问题 dpdp,只考虑第一次即可相关推荐

  1. R语言apriori算法进行关联规则挖掘(限制规则的左侧或者右侧的内容进行具体规则挖掘)、查看限制了规则的右侧之后挖掘到的规则(置信度排序,只查看左侧即可)

    R语言apriori算法进行关联规则挖掘(限制规则的左侧或者右侧的内容进行具体规则挖掘).查看限制了规则的右侧之后挖掘到的规则(置信度排序,只查看左侧即可) 目录

  2. 防抖函数:多次触发后只执行第一次或者最后一次的函数

    一. 应用场景 当前问题: 现在点击一个按钮,然后会向服务器请求一次数据.如果暴力操作,不断的点击按钮,那么就会一直向服务器请求,这样肯定不好,需要应用到防抖函数. 最终目的:多次触发只执行最后一次或 ...

  3. 【Android 小功能】启动 App 时实现启动页、引导页功能,并且只在第一次启动 App 时跳入引导页面

    [Android]如何实现启动APP时引导页.欢迎页功能之(一)引导页功能的实现 [Android]如何实现启动APP时引导页.欢迎页功能设置之(二)设置只在第一次启动APP时跳入引导界面

  4. 读取一组电话号码簿(由姓名和手机号码组成),将重复出现的项删除(姓名和电话号码都相同的项为重复项,只保留第一次出现的项),并对姓名相同手机号码不同的项进行如下整理。

    读取一组电话号码簿(由姓名和手机号码组成),将重复出现的项删除(姓名和电话号码都相同的项为重复项,只保留第一次出现的项),并对姓名相同手机号码不同的项进行如下整理:首次出现的项不作处理,第一次重复的姓 ...

  5. 每天一道LeetCode-----重新实现开方运算sqrt(x),只返回整数部分即可

    Sqrt(x) 原题链接Sqrt(x) 重新实现开方运算. 因为要求实现的开方运算只需要返回整数部分即可,所以首先考虑一下当n为多少时可以返回. n是给定x的开方结果一定满足 n * n <= ...

  6. 股票分析,利用线性回归实时预测股价,只需要提供股票代码即可爬取相应股票数据并建模

    这里参考了别人的代码,并引用了tushare模块中定义的接口自动获取了依据 股票代码来获取数据 此篇文章提供了 1.一个简单通过接口爬取csv数据的方法 2.一个处理csv数据的简单方法 3.依据数据 ...

  7. filter wiz_Grid Wiz简介:只需一瞬间即可制作出具有自定义浏览器支持CSS网格框架。

    filter wiz Today, I am thrilled to share with you a new, flexible grid framework generator: Grid Wiz ...

  8. 嵌套点击事件只执行第一次

    如下点击"哈哈哈"的时候只触发f2也就是弹出2,不弹出1 <a onclick='f1()'><div><span onclick="f2( ...

  9. 牛逼了,这21款游戏项目,只一行代码即可上手—开玩【附源码】

    导语 随着时代的不同 社会的改变 伴随着一起长大的游戏 逐渐淡出我们的视线 却一直铭刻在我们心中 ​ 还记得你小时候都玩过什么游戏吗?超级玛丽--坦克大战--魂斗罗--贪吃蛇--植物大战僵尸..... ...

最新文章

  1. 网络安全 — 安全架构
  2. 关于RPM包中的rpmnew和rpmsave
  3. 【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
  4. bootstrap table排序php,bootstraptable排序可以么
  5. 韩顺平php视频笔记77 抽象类vs接口 关键字final const
  6. pin码是什么意思?
  7. Report Machine 在WIN7系统下 IE里面运行错误
  8. 关于PC电脑微信进粉计数器的选择?
  9. 02333软件工程_202008_试卷+答案
  10. c语言库函数总结----ctype.h库
  11. 用《圣经》做训练数据集,达特茅斯学院完美打造语言风格转换工具
  12. 南航里程每年清空吗_南航里程即将大幅贬值!此期限前使用仍能保值
  13. Kindle接入HomeAssistant:实现锁屏壁纸显示HA内设备信息并在HA内获取Kindle电量
  14. web术语chm_笨客户端的20个Web设计行业术语
  15. WRF气象数据之NECP FNL数据批量下载
  16. Echarts绘制地图,且可以下钻到省区
  17. Python一行代码搞定炫酷可视化,Cufflinks值得拥有 !
  18. CVPR 2022 最新106篇论文分方向整理|包含目标检测、动作识别、图像处理等32个方向
  19. 干货 | NLP算法岗大厂面试经验与路线图分享
  20. 视频教程-快速入门Android开发 视频 教程 android studio-Android

热门文章

  1. 假定某一个数据列表是一个班级的计算机课程,若需要利用形参直接访问实参,则应把形参变量说明为()参数。A.指针B.引用C.传值D.常值...
  2. 冯珊珊_模拟器企业衡泰信签约冯珊珊,推动高尔夫运动下沉
  3. mysql数据库连接时区设置_springboot 连接数据库之时区设置
  4. android中的add方法,Android入门之addWindow
  5. python科学计算与图形渲染_宁哥Python科学计算与图形渲染库课程
  6. PL/SQL Developer跑在Oracle 64位数据库上初始化错误
  7. 160 - 35 cupofcoffe.1
  8. icse ccf_ICSE的完整形式是什么?
  9. Java MathContext类| hashCode()方法与示例
  10. 合页损失,铰链损失_多点铰链损失功能 使用Python的线性代数