洛谷P3507 [POI2010]GRA-The Minima Game

题目

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	
*/  
posted @ 2019-09-25 16:04  DAGGGGGGGGGGGG  阅读(126)  评论(0编辑  收藏  举报