数组的最大代价
数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。数组A的代价定义如下:
(公式表示所有两个相邻元素的差的绝对值之和)
给出数组B,计算可能的最大代价S。
5 10 1 10 1 10
36
【分析】已知1<=a[i]<=b[i],求相邻的a[i]的差的和最大,所以a[i]不是取最大的b[i],就是取最小的1。
用dp1[i]来保存a[i]取1时的最大代价。dp1[i] = max(dp[i-1]+b[i-1]-1,dp1[i-1]+1-1);
用dp[i]来保存a[i]取最大值b[i]时的代价。dp[i] = max(dp1[i-1]+b[i]-1,dp[i-1]+(int)abs(b[i]-b[i-1]));
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define cl(a,b) memset(a,b,sizeof a);
const int maxn = 5*1e4 + 10;
int b[maxn];
int dp[maxn],dp1[maxn];
int main()
{
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++)
scanf("%d",b+i);
cl(dp,0);cl(dp1,0);
for(int i=2;i<=n;i++){
dp1[i] = max(dp[i-1]+b[i-1]-1,dp1[i-1]+1-1);
dp[i] = max(dp1[i-1]+b[i]-1,dp[i-1]+(int)abs(b[i]-b[i-1]));
}
printf("%d\n",max(dp[n],dp1[n]));
}
return 0;
}