DP、およびDPが最適化されています。
この問題は、はっきりDPは、状態が良く定義されています
DPの定義[i]はiは、得られる数の両方を取る合計時間との間の最大の差を示しています。
次に、状態遷移方程式を導出することができる、すなわち\(DP [I] =最大 (データ[J] -dp [J-1]); J <= iが\) の時間複雑度\(O(N ^ 2) \ )
次に、伝達方程式を簡略化することができる、すなわちクリック\(DP [I] =最大 (DP [I-1]、DATA [i]は-dpを[I-1])\) 得ることが\(O(N)\)時間複雑。
式の意味単独であれば、つまり、i番目に最大値の差である\(DATA [i]を-dp [1-I] \) 、前者であれば\(I-1 \)番号同時に撮影し、結果は\(DP [I-1] \)
#include <bits/stdc++.h>
#define N 1010010
#define int long long
using namespace std;
int n, data[N], dp[N];//dp[i]表示双方共取了i个数,所得到的最大差值。
bool cmp(int a, int b) {
return a > b;
}
signed main()
{
scanf("%lld", &n);
for (int i = 1; i <= n; i++)
scanf("%lld", &data[i]);
sort(data + 1, data + 1 + n);
for (int i = 1; i <= n; i++)
dp[i] = max(dp[i - 1], data[i] - dp[i - 1]);
printf("%lld", dp[n]);
return 0;
}
/*
3
1 3 1
2
*/