DP,及DP的优化。
这个题显然是一个DP,状态也比较好定义,
定义dp[i]表示双方总共取i个数时,所得到的最大差值。
然后可以得出状态转移方程,即 (dp[i]=max(data[j]-dp[j-1]);j<=i) 时间复杂度为(O(n^2))
然后可以简化一下转移方程,即(dp[i]=max(dp[i-1],data[i]-dp[i-1]))可得到(O(n))的时间复杂度。
该方程的意思就是第i个数时得到的最大差值,如果单独取,那就是(data[i]-dp[i-1]),如果和前(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
*/