3.31 腾讯笔试第四题66% 求大佬指点

小红拿到了一个数组,她准备将数组分割成 k 段,使得每段内部按位异或后,再全部求和。小红希望最终这个和尽可能大,你能帮帮她吗?

输入描述

输入包含两行。第一行两个正整数 n, k ($$ 1 \leq k \leq n \leq 400$$ ),分别表示数组的长度和要分的段数。

第二行 n 个整数 $$ a_i $$ ( $$0 \leq a_i \leq 10^9$$),表示数组 a 的元素。

输出描述

输出一个正整数,表示最终的最大和。

示例1

输入

6 2

1 1 1 2 3 4

输出

10

import java.util.Scanner;

public class Demo84 {
    // 动态规划 f[i][cnt] 表示[i, n-1]分割 k-cnt 段能产生的最大和 return f[0][0]
    // 初始化最后一排为0,最后一列为0 内外层都是从后往前遍历
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        int[] arr = new int[n];
        int[] sum = new int[n + 1]; // 异或前缀和
        for (int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
            sum[i + 1] = sum[i] ^ arr[i];
        }
        long[][] f = new long[n + 1][k + 1];
        for (int i = k - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                for (int t = n; t >= j + 1 ; t--) { // 状态转移
                    f[i][j] = Math.max(f[i][j], f[i + 1][t] + (sum[t] ^ sum[j]));
                }
            }
        }
        System.out.println(f[0][0]);
    }
}

#腾讯笔试##java##暑期实习##笔试##腾讯#
全部评论
看着感觉没问题。。
点赞 回复 分享
发布于 2024-04-01 21:15 湖北

相关推荐

03-07 13:32
门头沟学院 C++
D0cC:你是本科生吗,太厉害了
点赞 评论 收藏
分享
3.21&nbsp;一面自我介绍有一个新的业务,你会怎么做?(数仓建模方式)数仓分层有什么好处介绍一下Spark的join方式(broadcast&nbsp;join,&nbsp;shuffle&nbsp;hash&nbsp;join,sort-merge&nbsp;join)shuffle&nbsp;hash&nbsp;join&nbsp;和&nbsp;sort-merge&nbsp;join&nbsp;Spark常用的join是哪个?介绍一下MapReduce的执行过程Hive&nbsp;SQL优化星型模型、雪花模型的区别及应用场景介绍项目,项目分层是如何实现的项目的ods层数据是如何得到的,dws层是如何设计的sql&nbsp;:&nbsp;1、求在线店铺的月累积销售金额&nbsp;2、求相邻在线店铺的月累积销售金额的差额sum()&nbsp;ove...
OceanRivers:感觉现在的企业是真抽象,找实习生要求要有实习经历(我要是有实习经历还要来找实习吗),这和校招招应届生的要求有啥区别,按这逻辑以后是不是毕业找工作直接要求一年以上工作经验,也不知道是现在行业卷到这地步了还是企业单纯不想花更多资源培养新人,就想着招有工作经验的牛马,入职直接酷酷工作,然后给他发实习生水平的薪资当廉价劳动力
查看18道真题和解析
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务