当前位置:首页 > 题解目录 > 正文内容

【题解】数字的选择

亿万年的星光3年前 (2022-10-21)题解目录2057

【题目描述】

有n个非负整数,请从这n个非负整数中,选出m个数,在不改变m个数的顺序的情况下,构成一个新数列,要求该数列的中相邻两个数的差值绝对值的和尽可能小。

请问,这个最小的差值绝对值的和是多少?

比如:有5个数是2 1 8 5 9,如果从中选3个数,不改变顺序的情况下,要求相邻2个数的差值绝对值的和最小,选数方法可以是:2 1 5,差值绝对值的和是|1-2|+|5-1|=5。

【输入描述】

第1行输入2个整数,分别是n和m。(2≤m≤n≤100)

第2行,有n个非负整数,数字之间用空格隔开。

【输出描述】

按题意输出最小的差值绝对值的和。(本题保证计算出来的结果,在int的范围内)

【样例输入】

5 3
2 1 8 5 9

【样例输出】

5


【参考答案】

#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
int n,m;
int a[N],f[N][N];
 
int main(){
	cin>>n>>m;
	for(int i = 1;i <= n;i++){
		scanf("%d",&a[i]);
	}
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			f[i][j] = 1e9;
		}
	}
	
	int ans = 1e9;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= min(i,m);j++){
			if(j == 1){
				f[i][j] = 0;
				continue;
			}
			for(int k = j-1;k < i;k++){
				f[i][j] = min(f[i][j],f[k][j-1]+abs(a[k]-a[i]));
			}
			
			if(j == m) ans = min(ans,f[i][j]);
		}
	}
	
//	for(int i = 1;i <= n;i++){
//		for(int j = 1;j <= m;j++){
//			cout<<f[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	
	cout<<ans;
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】二分法查找左边界

参考代码:# include <bits/stdc++.h> using namespace std; int a[100005];&...

【题解】转换字符串的最少操作次数

【题目描述】给你一个字符串 s ,由 n 个字符组成,每个字符不是 'X' 就是 'O' ...

【循环】日记第几天

【题目描述】小明每天都坚持写日记,突然有一天小明在想,我今年写了多少篇日记了?一篇一篇的数好麻烦,没办法小明只能把这个艰难的问题交给聪明的你来解决。【输入描述】输入三个整数�y,m,d分别表示年月日,...

【题解】求逆序对个数

【题目描述】有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n] (n<10000),若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,...

【题解】取余(2019青岛市程序设计竞赛)

【问题描述】给你n个正整数a1,a2,..,an。求(a1*a2*..an)%10007的值。【输入】第一行,n,表示整数的个数。第二行,n个用空格隔开的正整数。【输出】一个整数,(a1*a2*..a...

【题解】家庭问题

【题目描述】有n个人,编号为1,2,……n,另外还知道存在K个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有...