C. The Sports Festival https://codeforces.com/contest/1509/problem/C
终于学会dp了,此题属于区间dp。
首先sort一下,用d[i][j]表示上场为s[i]到s[j]时的最小值。 ans=d[1][n],最后上场的肯定为最大最小值。
状态转移方程:d[i][j]=s[j]-s[i]+min(d[i+1][j],d[i][j-1]),只能从这两个状态得到。
问题边界:上场为一个人时,都为0,即d[i][i]=0
#include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<map> #include<cstring> #include<string> #include <iomanip> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; int s[2005]; ll d[2005][2005]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i]; } sort(s + 1, s + n + 1); for (int i = 1; i <= n; i++) { d[i][i] = 0; } for (int dis = 1; dis < n; dis++) { for (int i = 1; i + dis <= n; i++) { d[i][i + dis] = s[i + dis] - s[i] + min(d[i + 1][i + dis], d[i][i + dis - 1]); } } cout << d[1][n]; }
原文:https://www.cnblogs.com/lingshi321/p/14672857.html