笔试训练,牛客.合唱团牛客.kannan与高音牛客.拜访(BFS)牛客.买卖股票的最好时机(四)

news2024/12/28 12:37:59

目录

牛客.合唱团

牛客.kannan与高音

牛客.拜访(BFS)

牛客.买卖股票的最好时机(四) 


牛客.合唱团

dp[i][j]:从1到i,中挑选最大乘积是多少,但是我们会发现状态转移方程推不出来,我们不知道如何推导的任意两个人,

从[1,i]中挑选,最大乘积是多少

dp[i][j]:从[1,i]中挑选,把j个人,最大乘积(arr[i]:必选,此时的一个最大乘积),因为我们知道获取这个状态值的时候,我们会知道,后面选当前位置的时候,前面那些人应该选择那哪些位置

f[i][j]:表示从[1,i]中挑选,挑选j个人,最后一个人必定选择,此时的最大乘积

g[i][j]:表示从[1,i]中挑选,最后一个人必选,此时的最小乘积。

返回值:

f[n][k],f[k][k]。

3.状态转移方程:

f[i][j]=Math.max(g[prev][j-1]*a[i],f[prev][j-1]*a[i]);

g[i][j]=Math.min(f[prev][j-1]*a[i],f[prev][j-1]*a[i]);

初始化

对角线以下,包括对角线

初始化:第一列会有可能越界,前i个里面选1个,且最后一个是必定选的,我们要记住,就好初始化了。

返回值

从f[k][k]-f[n][k]的max

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
            int n = in.nextInt();
            long[]arr=new long[55];
            for(int i=1;i<=n;i++){
             arr[i]=in.nextLong();
            }
            int k= in.nextInt();
            int d=in.nextInt();
            long[][]f=new long[55][15];
            long[][]g=new long[55][15];
          
            //填写每一行
            for(int i=1;i<=n;i++)
            {   f[i][1]=g[i][1]=arr[i];
                //假如i比较小的话,你从这么多k里面挑选不出来的是
                for(int j=2;j<=Math.min(k,i);j++){
                    //初始化,里面都初始化为无穷
                    f[i][j]=-0x3f3f3f3f3f3f3f3fL;
                    g[i][j]=0x3f3f3f3f3f3f3f3fL;
                    //两个中的最小值,他这里的比较,你要知道是比较什么
f[I][j],保存的是上一个位置的值,因为从i个人里面选j个,的前一个状态是prev里面选j-1个,f[i][j]:
最后的比较是因为prev也在不断的变化,我们需要从i-d到,j-1到i-1保存一个最大的。f[i][j]看图

                    for(int prev=Math.max(i-d,j-1);prev<=i-1;prev++){
                        f[i][j]=Math.max(Math.max(f[prev][j-1]*arr[i],g[prev][j-1]*arr[i]),f[i][j]);
                        g[i][j]=Math.min(Math.min(f[prev][j-1]*arr[i],g[prev][j-1]*arr[i]),g[i][j]);
                    }
                }  
            }
            long ret=-0x3f3f3f3f3f3f3f3fL;
            //f[k][k]-f[n][k]之间的最大值
            for(int i=k;i<=n;i++){
            ret=Math.max(ret,f[i][k]);
            }
            System.out.println(ret);
            
    }
}

牛客.kannan与高音

开始的时候,我以为这个和之前那个最长递增子序列是一种类型,另外还是最优解,我直接想的就是用动态规划,但是发现动态规划无法使用,因为他是连续的子数组,而不是子序列,他是截取一段连续的序列,所以不可以是用什么dp[i][j]减去xx啥的。

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n = in.nextInt();
        int[]a = new int[n + 1]; 
        long max=1;
        //dp[i][j]表示以j位置开启,i位置结束的最大长度
        for (int i = 1; i <= n; i++) {
            a[i] = in.nextInt();
        }

        for(int i=1;i<=n;){
        int left=i;
        int right=i+1;
        long count = 1;
         while(left<=n&&right<=n&&a[right]-a[left]<=8){
            count++;
            left++;
            right++;
         }
         i=right;
         max=Math.max(max,count);
        }

        System.out.print(max);
    }
}

牛客.拜访(BFS)

单元最短路问题。​​​​​​​

这是我做过比较难的bfs问题,需要存储的东西,如果你想不到这个表,那么就会比较麻烦了,所以我们需要这两张表,确实蛮复杂,比我想象的,但是摸索下来还是可以有一些思路的

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param CityMap int整型二维数组
     * @param n int整型
     * @param m int整型
     * @return int整型
     */
    static int[]dx = {0, 0, 1, -1};
    static int[]dy = {1, -1, 0, 0};
    public int countPath (int[][] CityMap, int n, int m) {
       //从起点位置到当前点的最短距离
        int[][]dist=new int[n][m];
        //从起点位置到当前位置最短距离的方案长度
        int[][]count=new int[n][m];
        Queue<int[]>q = new LinkedList<>();
        int ret=1;
        int[]d = new int[2];
        for (int i = 0; i < n; i++) {
            Arrays.fill(dist[i],-1);
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (CityMap[i][j] == 2) {
                    q.add(new int[] {i, j});
                    count[i][j]=1;
                    dist[i][j] = 0;
                } else if (CityMap[i][j] == 1) {
                    d[0] = i;
                    d[1] = j;
                }
            }
        }
        while (!q.isEmpty()) {
            int x=0;
            int y=0;
//sz代表每次进入q的组数,一次进两组的话,那么就这两组往上下左右遍历,遍历之后,最短的距离就+1
            int sz = q.size();
            while (sz != 0) {
                int[]t = q.poll();
                for (int i = 0; i < 4; i++) {
                    x = t[0] + dx[i];
                    y = t[1] + dy[i];
                    if (x >= 0 && x < n && y >= 0 && y < m && CityMap[x][y] != -1) {
//这里这个dist[x][y]假如是-1,那么说明第一次过来,我们需要把这个值,赋值成当前距离
                        if (dist[x][y] == -1) {
                            q.add(new int[]{x, y});
                            dist[x][y] = ret;
                            //第一次到达这个位置,需要等于他的上一个位置,因为是第一次到达,所以这个数字也是初始值1。
                            count[x][y] = count[t[0]][t[1]];
                        } else {
                            //观察是不是最短的距离。假如他是最短距离的话,那么他前面那个最短位置+1就会到目标位置,此时这个位置,就需要继承他的那个相当于父亲位置。
                            if (dist[t[0]][t[1]] + 1 == dist[x][y]) {
                                count[x][y] += count[t[0]][t[1]];
                            }
                        }
                    }
                }
                sz--;
            }
//ret这个值代表,从起点出发,到终点的最短距离,每次一组遍历,一个上下左右合记为一步,所以说,ret在最后++
            ret++;
        }
        return count[d[0]][d[1]];
    }
}

牛客.买卖股票的最好时机(四) 

​​​​​​​

 public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n=in.nextInt();
        int k=in.nextInt();
        int[]prices=new int[n+1];
        for(int i=0;i<n;i++){
            prices[i]=in.nextInt();
        }
        //第i笔交易下第j天结束后最后一次状态是买入的最大收入
        int[][]f=new int[n][k+1];
        //第i笔交易下,第j天结束最后一次状态是卖出的最大收入
        int[][]g=new int[n][k+1];
        for(int i=0;i<=k;i++){
            f[0][i]=-0x3f3f3f3f;
            g[0][i]=-0x3f3f3f3f;
        }
        k=Math.min(k,n/2);
        f[0][1]=-prices[0];
        g[0][0]=0;

            for(int i=1;i<n;i++){
                for(int j=1;j<=k;j++){
                f[i][j]=Math.max(f[i-1][j],g[i-1][j-1]-prices[i]);
                g[i][j]=Math.max(g[i-1][j],f[i-1][j]+prices[i]);
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[解决]Invalid configuration `aarch64-openwrt-linux‘: machine `aarch64-openwrt

背景 交叉编译libev-4.19 问题 checking host system type… Invalid configuration aarch64-openwrt-linux: machine aarch64-openwrt’ not recognized 解决 打开config.sub&#xff0c;在244行后添加"| aarch64-openwrt \ "

RK 方案u-boot阶段添加驱动

驱动部分&#xff1a; u-boot/drivers/video/drm/gpio_init.c /** (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd** SPDX-License-Identifier: GPL-2.0*/#include <config.h> #include <common.h> #include <errno.h> #include <malloc…

jmeter连接mysql数据,并将查询结果存储到指定txt文件中

1、首先jmeter先进行连接mysql相关的配置&#xff0c;我之前已经有教程了就不赘述了&#xff0c;教程链接如下 jmeter连接mysql数据库以及常规用法-CSDN博客 2、当jmeter成功配置mysql数据库后&#xff0c;在JDBC Request组件中进行如下配置 Variable Name of Pool declared…

关于springboot对接通义千问大模型的尝试

今天正在路上刷手机&#xff0c;突然看到群里有人发了一个链接&#xff0c;内容是Spring Cloud Alibaba AI 的使用&#xff0c;spring cloud AI的使用&#xff0c;于是就想着玩一玩试试&#xff0c;难度不大&#xff0c;就是有些文档的坑&#xff0c;这里做一个记录&#xff0c…

基于RK3588+MCU智能清洁车应用解决方案

智能清洁车应用解决方案 在智慧城市建设发展的过程中&#xff0c;智慧环卫是打造智慧城市的重要组成部分&#xff0c;智能清洁车作为实现环卫智能化、提升作业效率和服务质量的关键工具&#xff0c;发挥着不可或缺的作用。 智能清洁车集成了激光雷达、双目视觉、多重传感器以及…

九月更新|用这5个简单技巧,新手在国内也能轻松使用ChatGPT,GPT新手使用手册(学术教师)

一、 ChatGPT可以做什么&#xff1f; 简单来说&#xff0c;ChatGPT就像一个超级智能的聊天机器人&#xff0c;它可以做很多事情。你可以把它想象成一个非常聪明的助手&#xff0c;随时随地帮你解答问题、提供建议、写文章、甚至讲笑话。以下是几个具体的例子&#xff1a; 1. …

论文浅尝 | 超越实体对齐: 通过实体关系协同实现完整的知识图谱对齐

笔记整理&#xff1a;米尔扎提阿力木&#xff0c;天津大学硕士&#xff0c;研究方向为大模型 论文链接&#xff1a;https://arxiv.org/abs/2407.17745 摘要 知识图谱对齐(Knowledge Graph Alignment, KGA)旨在整合来自多个来源的知识&#xff0c;以解决单个知识图谱在覆盖范围和…

一文带你了解可观测领域中APM与eBPF的技术差异

近年来&#xff0c;随着eBPF技术的兴起&#xff0c;很多人有这样的疑惑&#xff1a;eBPF和APM有什么区别&#xff1f;他们是竞争关系还是合作关系&#xff1f;本文将就此展开讨论&#xff0c;并给出切实有效的落地方案。 01APM APM全称&#xff1a;Application Performance Ma…

vulhub xxe靶机

步骤一&#xff0c;访问浏览器 步骤二&#xff0c;输入/robots.txt 步骤三&#xff0c;发现存在用户登录的一个界面/xxe 我们登录进去 步骤四&#xff0c;随便输入一个数字或者字母打开BP 抓到包之后发送的重放器里边 通过抓包发现是XML数据提交 步骤五&#xff0c;通过php…

【采集软件】抖音根据关键词批量采集搜索结果工具

这是我用Python开发的抖音关键词搜索采集工具软件。 软件界面截图&#xff1a; 爬取结果截图&#xff1a; 软件演示视频&#xff1a; https://www.bilibili.com/video/BV1Fc41147Be 完整讲解文章&#xff1a; https://www.bilibili.com/read/cv33750458

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(九)imu运动学;lambda表达式;bind;function;std::move()

一、IMU运动学 1、测量值&#xff1a; 常用六轴IMU是由陀螺仪&#xff08;Gyroscope&#xff09;和加速度计&#xff08;Acclerator&#xff09;两部分组成。 陀螺仪测量&#xff1a;角速度。加速度计&#xff1a;加速度。 安装要尽量保证IMU的安装位置在车辆中心。避免由I…

基于SOA-BP海鸥优化BP神经网络实现数据预测Python实现

BP神经网络是一种多层前馈神经网络&#xff0c;它通过反向传播算法来训练网络中的权重和偏置&#xff0c;以最小化预测误差。然而&#xff0c;BP神经网络的性能很大程度上依赖于其初始参数的选择&#xff0c;这可能导致训练过程陷入局部最优解。海鸥优化算法因其探索和开发能力…

基于vue框架的残疾人就业帮扶平台97c5w(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,企业,招聘信息,类型,求职信息,投递信息,邀请信息,通知信息,帮扶政策,申请信息,意见反馈 开题报告内容 基于Vue框架的残疾人就业帮扶平台开题报告 一、选题背景与意义 随着社会的文明进步和经济的快速发展&#xff0c;残疾人群体…

flannel,etcd,docker

bridge容器 听有容器连接到桥就可以使用外网&#xff0c;使用nat让容器可以访问外网使用ipas指令查看桥&#xff0c;所有容器连接到此桥&#xff0c;ip地址都是172.17.0.0/16网段&#xff0c;桥是启动docker服务后出现&#xff0c;在centos使用bridge-utils安装 跨主机的容器…

第一次使用PyCharm写C++(失败)

前言&#xff1a; 由于我已经非常习惯使用PyCharm远程连接服务器了&#xff0c;我认为非常方便&#xff0c;所以希望C也能直接用Pycharm。于是尝试在PyCharm上部署C环境。 但是&#xff0c;我失败了。如果您知道问题所在&#xff0c;欢迎给我留言。我认为Pycharm并没有编译C/C…

Windows电脑微信可以登录发消息,但是网页打不开的解决方法:刷新DNS缓存

遇到的问题 今天实验室的电脑突然网页打不开&#xff0c;baidu上不了&#xff0c;chrome浏览器也上不了。但是ping baidu.com能够ping通&#xff0c;github pull也可以&#xff0c;网易云可以听歌。也就是说网络是通的&#xff0c;但是浏览器无法上网。 解决方法 我是通过 W…

直播商城APP开发指南:基于多商户商城系统源码的实现

对于开发者而言&#xff0c;构建一个功能完备、性能优越的直播商城APP已经成为当前技术领域的一个重要方向。本文将以多商户商城系统源码为基础&#xff0c;深入探讨如何高效开发一个直播商城APP。 一、多商户商城系统的核心概念 多商户商城系统是一种支持多个商家在同一平台…

深度解读SGM41511电源管理芯片I2C通讯协议REG09寄存器解释

REG09 是 SGM41511 的第十个寄存器&#xff0c;地址为 0x09。这是一个只读&#xff08;R&#xff09;寄存器&#xff0c;用于报告各种故障状态。上电复位值&#xff08;PORV&#xff09;为 xxxxxxxx&#xff0c;表示上电时的初始状态是不确定的。这个寄存器提供了充电器当前故障…

【Python机器学习】NLP词频背后的含义——从词频到主题得分

目录 TF-IDF向量及词形归并 主题向量 一个思想实验 一个主题评分算法 一个LDA分类器 LDiA TF-IDF向量&#xff08;词项频率—逆文档频率向量&#xff09;可以帮助我们估算词在文本块中的重要度&#xff0c;我们使用TF-IDF向量和矩阵可以表明每个词对于文档集合中的一小段…

【hot100篇-python刷题记录】【跳跃游戏】

R6-贪心算法 符合贪心的原因是&#xff1a; 我们要走到最后可以每次都选择尽可能远的来走&#xff0c;其次&#xff0c;能走到该步意味着该步以前都能到达。因此&#xff0c;局部最优解可以代表全局最优解。 class Solution:def canJump(self, nums: List[int]) -> bool:#最…