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

【题解】数字的选择

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

【题目描述】

有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;
}


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

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

    分享给朋友:

    相关文章

    【题解】最大平方因子

    【题目描述】给定一个整数 n,请找出 n 的最大平方因子。所谓平方因子,就是一个 n 的因子,且是一个完全平方数。最大平方因子就是 n&nb...

    【题解—深搜】马走日

    【题解—深搜】马走日

    【题目描述】马在中国象棋以日字形规则移动。请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。【输入】第一行为整...

    【题解】计数2的N次方

    【题目描述】任意给定一个正整数N(N≤100),计算2的n次方的值。【输入描述】输入一个正整数N。【输出描述】输出2的N次方的值。【样例输入】5【样例输出】32【参考答案】#include<io...

    【题解】使每位学生都有座位的最少移动次数

    【题目描述】一个房间里有 n 个 空闲 座位和 n 名 站着的 学生,房间用一个数轴表示。给你一个长度为 n&...

    【题解】数字三角问题

    【题解】数字三角问题

    【题目描述】给字一个由n行数字组成的数字三角形(等腰三角形)。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。【输入描述】数字三角形的行数和数字三角形【输出描述】最大的路...

    2020CSPJ-直播获奖

    【题目描述】NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为w%,即当前排名前 w% 的选手的最低成绩就是即时的分数线...