牛客小白月赛53——题号D
链接:https://ac.nowcoder.com/acm/contest/11230/D
来源:牛客网
来源:牛客网
题目描述
勇敢的牛牛得到了一个数列 B,他认为这个数列不够可爱,于是他决定重新创造一个数列 A,规则如下。
- 对于所有的 i,需要保证 Ai 在 [1,Bi] 这个区间内。
现在,我们称数列 A 的可爱值 k 为「数列 A 中相邻两个数差的绝对值的和,求最大的可爱值。
输入描述
第一行,一个正整数 n(2≤n≤10^5)。
第二行,n 个正整数,表示数列 B 中的数,1≤Bi≤10^4。
输出描述
一行,一个非负整数表示最大的可爱值 k。
示例1
输入
8
11 45 14 19 1 9 8 10
输出
149
示例2
输入
6
107 97 119 97 105 105
输出
550
解题思路
由于题目要求最大值,则每个Ai的取值,要么为1,要么为Bi
即可以用DP来做:
1、f[i][0] 表示第i个数Ai取1时,S中前i个数相邻两个数差的绝对值之和
而f[i][0]怎么求,我们可以往上推一步,利用上一步的答案来求解当前这一步的答案,于是可以推出最终答案是从f[i - 1][0]和f[i - 1][1] + s[i - 1] - 1两者中取较大者
2、f[i][1] 表示第i个数Ai取Bi时,S中前i个数相邻两个数差的绝对值之和
同1
最后的答案,则从f[n][0]和f[n][1]中取最大值即可
AC代码
import java.util.*; public class Main { static int N = 100000 + 10; static int[] s = new int[N]; static int[][] f = new int[N][2]; public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); for (int i = 1; i <= n; i++) { s[i] = in.nextInt(); } // f[i][0] 表示第i个数Ai取1时,前i个数中相邻两个数差的绝对值之和 // f[i][1] 表示第i个数Ai取Bi时,前i个数中相邻两个数差的绝对值之和 // 只有一个数时,不存在相邻两个数的差 for (int i = 2; i <= n; i++) { f[i][0] = Math.max(f[i - 1][0], f[i - 1][1] + s[i - 1] - 1); f[i][1] = Math.max(f[i - 1][0] + s[i] - 1, f[i - 1][1]); } System.out.println(Math.max(f[n][0], f[n][1])); } }