牛客小白月赛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]));
    }
    
}

 

posted @ 2022-07-09 09:04  没有你哪有我  阅读(63)  评论(0编辑  收藏  举报