给出一个整数 N,和一个长度为 N 的数组 B. 对于满足 1<=A[i]<=B[i]的长度为 N 的数组 A,
我们定义它的价值为相邻两项的差的绝对值之和. 求出价值最大是多少.
输入格式
第一行包含一个整数 N, 代表数组的长度. 接下来一行 N 个整数,第 i 个整数为 B[i].
输出格式
输出一个整数.
样例输入
5
10 1 10 1 10
样例输出
36
数据范围
对于 20%的数据, N <= 8, B[i] <= 8.
对于 40%的数据, N <= 1,000, B[i] <= 1,000.
对于 60%的数据, N <= 1,000.
对于 100%的数据, 1 <= B[i], N <= 1,000,000.
贪心,每个数取最大或最小值
滚动dp
#include <cstdio> #include <cmath> #include <bits/stdc++.h> #include <algorithm> using namespace std; #define MAXN 1000000+5 #define R register template <typename T> inline void read(T &x) { #define C getchar() char a=C;x=0;bool f=0; for(;a>'9'||a<'0';a=C) if(a=='-') f=1; for(;a>='0'&&a<='9';a=C) x=(x<<1)+(x<<3)+(a^48); if(f) x=-x; } int n,b[MAXN]; long long f[2][2]; int main() { freopen("b.in","r",stdin); freopen("b.out","w",stdout); read(n); for(R int i=1;i<=n;i++) read(b[i]); R int now=0,last; for(R int i=2;i<=n;i++) { last=now;now^=1; f[now][0]=f[now][1]=0; f[now][0]=max(f[last][0],f[last][1]+b[i]-1); f[now][1]=max(f[last][1],f[last][0]+b[i-1]-1); } printf("%lld",max(f[now][1],f[now][0])); return 0; }