首页 > 代码库 > 51Nod-1270-数组的最大代价

51Nod-1270-数组的最大代价

51Nod-1270-数组的最大代价

1270 数组的最大代价
数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。数组A的代价定义如下:
 
技术分享
 
(公式表示所有两个相邻元素的差的绝对值之和)
给出数组B,计算可能的最大代价S。
Input
第1行:1个数N,表示数组的长度(1 <= N <= 50000)。
第2 - N+1行:每行1个数,对应数组元素Bi(1 <= Bi <= 10000)。
Output
输出最大代价S。
Input示例
5
10
1
10
1
10
Output示例
36

 

 

 

题解:

对于数组中的一个数, 无非就有两种选择:(1)它本身,(2),1, 所以明显的简易DP问题

构建

动态规划公式: f[i][0] 表示第i个数由他本身表示, f[i][1] 表示第i个数有1表示。 

就有公式: 

    dp[i][0] = max(dp[i-1][0]+abs(num[i]-num[i-1]), dp[i-1][1]+abs(num[i]-1));
    dp[i][1] = max(dp[i-1][0]+abs(1-num[i-1]), dp[i-1][1]); 

简易的DP方程

 

 

 

 

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <cstdlib> 
#include <cmath> 
using namespace std; 
const int MAXN = 50000; 

int num[MAXN], dp[MAXN][2]; 

int func(int n){
	dp[0][0] = dp[0][1] = 0; 
	for(int i=1; i<n; ++i){
		dp[i][0] = max(dp[i-1][0]+abs(num[i]-num[i-1]), dp[i-1][1]+abs(num[i]-1)); 
		dp[i][1] = max(dp[i-1][0]+abs(1-num[i-1]), dp[i-1][1]); 
	}
	return max(dp[n-1][0], dp[n-1][1]);  
}

int main(){
	freopen("in.txt", "r", stdin); 

	int n; 
	while(scanf("%d", &n) != EOF){
		for(int i=0; i<n; ++i){
			scanf("%d", &num[i]); 
		}
		int ans = func(n); 
		printf("%d\n", ans );
	}
}

  

 

51Nod-1270-数组的最大代价