首页 > 学院 > 开发设计 > 正文

Codeforces Round #276 (Div. 1) D. Kindergarten dp

2019-11-08 00:43:22
字体:
来源:转载
供稿:网友

点击打开链接

题意:

给你n个连续的数,让你划分成连续的区间,每个区间的价值为此区间内最大最小值之差,问你这n个数形成的最大价值是多少

思路:

最终的被分出来的序列都应该是单调的,如果你是形如 4 6 1 的,很可能可以将4或者1分割出去得到更大的值

贪心是让一段序列的元素少,这样构成的序列更多,获得的值也就可能越大。

考虑v形倒v形就好了

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define mem(a) memset(a,0,sizeof(a))#define mp(x,y) make_pair(x,y)const int maxn = 1e6+10;const int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//////////////////////////////////////////////////////////////////////////ll a[maxn],dp[maxn];int main(){	int n=read();	for(int i=1; i<=n; i++)		a[i] = read();	mem(dp);	for(int i=2; i<=n; i++){		if(a[i-1]>a[i] && a[i-1]>a[i-2]) dp[i] = max(dp[i-1],dp[i-2]+a[i-1]-a[i]);		if(a[i-1]<a[i] && a[i-1]<a[i-2]) dp[i] = max(dp[i-1],dp[i-2]+a[i]-a[i-1]);		if(a[i]>=a[i-1] && a[i-1]>=a[i-2]) dp[i] = dp[i-1] + a[i]-a[i-1];		if(a[i]<=a[i-1] && a[i-1]<=a[i-2]) dp[i] = dp[i-1] + a[i-1]-a[i];	}	// for(int i=1; i<=n; i++)	// 	cout << dp[i] << " ";	// cout << endl;	cout << dp[n] << endl;    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表