美文网首页
善变的同伴(快手校招题)

善变的同伴(快手校招题)

作者: 正经龙 | 来源:发表于2019-08-18 11:26 被阅读0次
image.png
image.png

分析

这个题目实际上是M段最大子段和的变式
可以通过动态规划来做

dp[i][j]代表共取 i 次菜,当前取完第 j 个菜时,最大的好吃程度之和
所以d[i][j] 有两个选择

  1. 选择以当前j为最后新开的一段的首,即与之前的段不连续,之前共有i-1段,则当前d[i][j] = Max(d[i-1][k])+A[j] k = i - j-1;
  2. 当前j添加到最后一段的末尾
    d[i][j] = d[i][j-1] + A[j];

以上两种方法的结果取最大的那个

public class Cookie {


    public static int get(int[] A,int M){
        int N = A.length;
        int dp[][] = new int[2][N];
        //滚动数组
        //记录两行
        for(int i = 0; i < N;i++){
            dp[0][i] = 0;
            dp[1][i] = 0;
        }

        //算出M = 1的一行
        int nowMax = Integer.MIN_VALUE;
        for(int i = 0; i < N;i++) {
            if (nowMax < 0) {
                nowMax = A[i];
            } else {
                nowMax = nowMax + A[i];
            }
            dp[1][i] = nowMax;
        }

        // M > 1时,利用滚动数组减少存储空间
        for(int i = 2,k = 0; i <= M; i++,k^=1){
            int beforeLineMax = Integer.MIN_VALUE;
            dp[k][i-2] = Integer.MIN_VALUE;
            for(int j = i-1; j < i + N - M;j++){
                beforeLineMax = Integer.max(beforeLineMax,dp[k^1][j-1]);
                dp[k][j] = Integer.max(beforeLineMax,dp[k][j-1])+A[j];
            }
        }
        int res = Integer.MIN_VALUE;
        //得到当前第M行的最大值
        for(int i = M; i < N ;i++){
            res = Integer.max(res,dp[M&1][i]);
        }
        return res;
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        int A[] = new int[N];
        for(int i = 0; i < N;i++){
            A[i] = sc.nextInt();//保存菜品
        }
        System.out.println(get(A,M));
    }
}

过程分析

备注(列号1对应下标为0)

1 2 3 4 5 6 7
M=0 1 2 3 -2 3 -10 3
M=1 1 3 6 4 7 -3 3
M=2 3 6 4 9 -1 10

过程


image.png

d[i][j]相当于同一行的前一格子+当前格子或者前一行(i~j-1)+当前格子的最大值

相关文章

  • 善变的同伴(快手校招题)

    分析 这个题目实际上是M段最大子段和的变式可以通过动态规划来做 dp[i][j]代表共取 i 次菜,当前取完第 ...

  • 快手校招真题一

    快手 获得最多的奖金 题目描述小明在越南旅游,参加了当地的娱乐活动。小明运气很好,拿到了大奖, 到了最后的拿奖金环...

  • 快手校招真题二

    善变的同伴 又到了吃午饭的时间,你和你的同伴刚刚研发出了最新的GSS-483型自动打饭机器人,现在你们正在对机器人...

  • 快手校招真题四

    最少数量货物装箱问题 题目描述有重量分别为3,5,7公斤的三种货物,和一个载重量为X公斤的箱子(不考虑体积等其它因...

  • 快手校招真题五

    字符串最大乘积 题目描述已知一个字符串数组words,要求寻找其中两个没有重复字符的字符串,使得这两个字符串的长度...

  • 快手校招真题六

    最小代价爬楼梯 你需要爬上一个N层的楼梯,在爬楼梯过程中, 每阶楼梯需花费非负代价,第i阶楼梯花费代价表示为cos...

  • 快手校招真题三

    快手 游戏海报 题目描述小明有26种游戏海报,用小写字母"a"到"z"表示。小明会把游戏海报装订成册(可能有重复的...

  • Android面经| 算法题解

    整理了校招面试算法题,部分《剑指offer》算法题,以及LeetCode算法题,本博文中算法题均使用Java实现校...

  • 2017年校招全国统一模拟笔试(第五场)编程题集合

    2017年校招全国统一模拟笔试(第五场)编程题集合 地址:2017年校招全国统一模拟笔试(第五场)编程题集合 偶串...

  • 2017年校招全国统一模拟笔试(第三场)编程题集合

    2017年校招全国统一模拟笔试(第三场)编程题集合 地址:2017年校招全国统一模拟笔试(第三场)编程题集合 变换...

网友评论

      本文标题:善变的同伴(快手校招题)

      本文链接:https://www.haomeiwen.com/subject/irhrsctx.html