点击打开链接
题意:
给你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;}
新闻热点
疑难解答