8597 石子划分问题 dpdp,只考虑第一次即可
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 + ;
int dp[maxn][maxn];
int a[maxn];
int dfs(int n, int m) {
if (m == ) return (a[n] - a[]) * (a[n] - a[]);
if (n == m) return ;
if (dp[n][m]) return dp[n][m];
int ans = 1e9;
for (int i = ; i <= n - m + ; ++i) {
ans = min(ans, dfs(n - i, m - ) + (a[n] - a[n - i + ]) * (a[n] - a[n - i + ]));
}
return dp[n][m] = ans;
} void work() {
int n, m;
cin >> n >> m;
for (int i = ; i <= n; ++i) cin >> a[i];
sort(a + , a + + n);
cout << dfs(n, m) << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}
作者
zhengchan
8597 石子划分问题 dpdp,只考虑第一次即可的更多相关文章
- sae-多个file_put_contents('saestor://public/text.txt',$data);只写第一次
多个file_put_contents('saestor://public/text.txt',$data); 只执行第一个文件的写入,永久存储也只需要一次写入 如果需要用户中间缓存文件,用tmpfs ...
- 使用sed在源文件上直接替换某一行的内容,只替换第一次找到的那行
sed -i 's/^mysqld_pid_file_path=.*$/mysqld_pid_file_path=\/data\/mysql\/run\/mysqld.pid/' /etc/init. ...
- sed 's/AA/BB/' file # 将文件中的AA替换成BB,只替换一行中第一次出现的AA,替换后的结果输出到屏幕 sed 's/AA/BB/g' file # 将文件中的所有AA都替换成BB,替换后的结果输出到屏幕
生信人的自我修养:Linux命令速查手册 简佐义 四川大学 生物信息学硕士 科学求真 赢 10 万奖金 · 院士面对面 209 人赞同了该文章 许多人做生物信息学,要么不重视Linux,要么不知道 ...
- 【Android】再来一篇Fragment懒加载(只加载一次哦)
效果 老规矩,先来看看效果图 没错,我又入坑了,又重新做了个 Gank 客户端,因为之前那个代码写得太烂了,这次有好好的考虑了下架构之类的事,代码应该会更容易读懂了点了,吧.哈哈,再次欢迎来 star ...
- 【集训队作业2018】【XSY3372】取石子 DP
题目大意 有 \(n\) 堆石子,初始时第 \(i\) 堆石子有 \(a_i\) 个. 你每次取石子会取 \(k\) 个.在你取完一堆石子之后才能在下一堆中取石子. 游戏会进行 \(t\) 轮,每轮会 ...
- [08山东省选]2298 石子合并 即POJ 1738 An old Stone Game
2298 石子合并 2008年省队选拔赛山东 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
- input file里的JQ change() 事件的只生效一次
文件选择框的onchange事件只在第一次改变时生效,以后再选择文件不会触发onchange事件. 解决方法1:用jQuery的live代替直接使用change. 错误代码: $("#Upl ...
- 区间DP经典 石子合并
题目链接 题意:环形的一群石子,每次可以选择相邻的两堆合并,分数为新得到的一堆石子,求将这片石子合并成一堆的最大和最小分数 输入:第一行一个正整数n,其后n个数代表每堆石子的个数 分析:第一次写的时候 ...
随机推荐
- 精美3D中国象棋
本人2013年的巅峰之作,现在已经完全免费放送.象棋界面的史诗革命.当前下载版本仅支持Windows 平台. 操作: 方向键的 上,下,左,右 控制棋盘翻转.Home 键回到初始状态,End按键回到平 ...
- 处理器适配器(handlerAdapter)执行源码分析(涉及到适配器模式)(九)
适配器:实现很多接口统一管理. DispatcherServlet 组建的默认配置 HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,A ...
- ubuntu配置静态路由
1. #ifconfig 注意 eth0为你要配置的interfase 2. #vi /etc/network/interfaces # This file describes the network ...
- 利用filter,巧妙地去除Array的重复元素
var r, arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry']; r ...
- JDK Linux下安装
下载jdk-6u45-linux-x64.bin到/root目录下执行./jdk-6u45-linux-x64.bin 会在/root目录下生成 jdk1.6.0_45 文件 之后配置环境变量 编辑/ ...
- Notification通知代码简洁使用
1.自定义发送 Notification 的使用 1.1 通知(消息)的创建 ---------------详细介绍篇 // 不带消息内容 NSNotification *notification1 ...
- java基础之开发环境配置
一. 环境变量配置的原理 一. 配置环境变量path 如果我们按照上面的来编译和运行的话未免太过于麻烦了,那么在这里我们可以配置环境变量PATH 1.配置环境变量的步骤 这时可以直接来看效果 如果d ...
- Scrapy 中 Request 对象和 Response 对象的各参数及属性介绍
Request 对象 Request构造器方法的参数列表: Request(url [, callback=None, method='GET', headers=None, body=None,co ...
- 魔法少女 LJJ——线段树
题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处 ...
- DP【洛谷P2363】马农
[洛谷P2363]马农 题目描述 在观看完战马检阅之后,来自大草原的两兄弟决心成为超级"马农",专门饲养战马. 兄弟两回到草原,将可以养马的区域,分为N*N的单位面积的正方形,并实 ...