【题解】数字的选择
【题目描述】
有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; }
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。