codeforces 484D Kindergarten (dp、贪心)

题意:给n个数,分成若干个连续组,每组获益为max-min,输出最大获益。

 

参考:http://blog.csdn.net/keshuai19940722/article/details/40873581

 

参考的链接里说得很明白了,我的dp[i][0]是升序,dp[i][1]是降序,习惯而已。

这题关键点就是,如果a[i-1]<a[i]>a[i+1],显然3个分开(a[i]归左或右)不比在一起差。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include <queue>
#include <map>
#include <ctime>
using namespace std;

#define ll long long
#define MP make_pair

#define inf 1e9
#define eps 1e-8

#define maxn 1010000

int a[maxn];
ll dp[maxn][2];
int main(){
	int n;
	while(~scanf("%d",&n)){
		for(int i=0;i<n;++i) scanf("%d",a+i);
		dp[0][0]=dp[0][1]=0;
		for(int i=1;i<n;++i){
			if(a[i-1]<a[i]){
				dp[i][0] = max(dp[i-1][0]+a[i]-a[i-1], dp[i-1][1]);
				dp[i][1] = max(dp[i-1][0], dp[i-1][1]);
			}else {
				dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
				dp[i][1] = max(dp[i-1][1]+a[i-1]-a[i], dp[i-1][0]);
			}
		}
		printf("%I64d\n", max(dp[n-1][0], dp[n-1][1]));
	}
	return 0;
}

 

你可能感兴趣的:(codeforces 484D Kindergarten (dp、贪心))