51Nod-1270-数组的最大代价
Posted zhang--yd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod-1270-数组的最大代价相关的知识,希望对你有一定的参考价值。
51Nod-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-数组的最大代价的主要内容,如果未能解决你的问题,请参考以下文章