刷题日记——三种方法秒杀《最大子串和》(厦大机试)

news2024/12/24 9:05:36

题目

在这里插入图片描述

分析——暴力

两个for循环,计算每一种子序(连续)和的值,找到最大时的自序起点和终点,输出即可

代码

#include <cstdio>
#include <map>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>

using namespace std;

int main(){
  int n;
  int seq[101];
  int rut[101];
  int a,b;
  while(scanf("%d",&n)!=EOF){

    for(int i=0;i<n;i++){
      scanf("%d",&seq[i]);
    }

    int max = INT_MIN;
    for(int i=0;i<n;i++){
      int sum = seq[i];
      if(sum>max){
        max = sum;
        a=i;b=i;
      }
      for(int j=i+1;j<n;j++){
        sum += seq[j];
        if(sum>max){
          max = sum;
          a=i;b=j;
        }
      }
    }
    for(int i=a;i<=b;i++){
      printf("%d ",seq[i]);
    }
    printf("\n%d\n",max);
  }
	return 0;
}

分析——贪心

若起点值是负数,下一个值是正数,那么如果仍然从这个负数开始计算,总体值会变小,不如抛弃这个负数,将下一个正数作为起点

  • 局部最优:连续和为负数时,选择当前值作为新的起点,重新开始计算,(注意,不是遇到负数就抛弃)
  • 全局最优:获得全局最大值

代码

#include <cstdio>
#include <map>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>
using namespace std;

int main(){
  int n;
  int seq[101];
  int a,b;
  while(scanf("%d",&n)!=EOF){

    for(int i=0;i<n;i++){
      scanf("%d",&seq[i]);
    }

    int result = INT_MIN;
    int count = 0;

    for(int i=0;i<n;i++){
      count += seq[i];
      if(count>result){
        result = count;
        b = i;
      }
      if(count<0){
        count = 0;
      }
    }
    int temp = result;
    a = b;
    while(true){
      temp -= seq[a];
      if(temp==0){
        break;
      }
      a--;
    }
    for(int i=a;i<=b;i++){
      printf("%d ",seq[i]);
    }
    printf("\n%d\n",result);
  }
	return 0;
}

分析——动态规划

求最大子序和

  1. dp数组的含义:以 n u m [ i ] num[i] num[i]为结尾的最大子序列之和
  2. 递推公式: d p [ i ] = m a x ( d p [ i − 1 ] + n u m [ i ] , n u m [ i ] ) dp[i]=max(dp[i-1]+num[i],num[i]) dp[i]=max(dp[i1]+num[i],num[i])
    • 与前面的子串和累加: = d p [ i − 1 ] + n u m [ i ] =dp[i-1]+num[i] =dp[i1]+num[i]
    • 抛弃前面的子串: = n u m [ i ] =num[i] =num[i]
  3. dp数组初始化, d p [ 0 ] = n u m [ 0 ] dp[0]=num[0] dp[0]=num[0]
  4. 遍历顺序:从1到末尾(n-1)
  5. 最终结果:dp数组中最大的值

求最大子序的始末位置

求法其实跟上面的贪心一样,上面忘了说,这里补充一下始末位置的求法:
a是起始序号,b是结束序号,temp是最大子序和result的copy

  1. 找到最大子序串结束的位置b,令a=b
  2. while(true):temp减去seq[a]的值,然后判断是否为0,如果为零结束循环,不为零就让a自减1
  3. 上面的while结束就能得到a,就是起始序号

代码

#include <cstdio>
#include <map>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>
using namespace std;

int main(){
  int n;
  int seq[101];
  int dp[101];
  int a,b;
  while(scanf("%d",&n)!=EOF){
    //输入
    for(int i=0;i<n;i++){
      scanf("%d",&seq[i]);
    }
    //dp数组初始化
    dp[0]=seq[0];
    //开始遍历
    for(int i=1;i<n;i++){
      dp[i]=max(dp[i-1]+seq[i],seq[i]);
    }
    int temp = dp[0];
    for(int i=1;i<n;i++){
      if(temp<dp[i]){
        temp = dp[i];
        b=i;
      }
    }
    a=b;
    int result = temp;
    while(true){
      temp -= seq[a];
      if(temp==0){
        break;
      }
      a--;
    }
    for(int i=a;i<=b;i++){
      printf("%d ",seq[i]);
    }
    printf("\n%d\n",result);
  }
	return 0;
}

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

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

相关文章

2024-03-14 Android app runOnUiThread 函数,它的作用是让一个Runnable对象在主线程(UI线程)上运行。

一、看到别人app有这么一个runOnUiThread 函数用法。 二、在Android中&#xff0c;runOnUiThread 是一个非常重要的方法&#xff0c;它的作用是让一个Runnable对象在主线程&#xff08;UI线程&#xff09;上运行。在Android中&#xff0c;主线程是负责更新UI的线程&#xff0c;…

StarRocks面试题及答案整理,最新面试题

StarRocks 的 MV&#xff08;物化视图&#xff09;机制是如何工作的&#xff1f; StarRocks 的物化视图&#xff08;MV&#xff09;机制通过预先计算和存储数据的聚合结果或者转换结果来提高查询性能。其工作原理如下&#xff1a; 1、数据预处理&#xff1a; 在创建物化视图时…

JOSEF约瑟 TQ-100同期继电器 额定直流电压220V 交流电压100V±10V

TQ-100型同期继电器 TQ-100同期继电器 ​ l 应用 本继电器用于双端供电线路的自动重合闸和备用电源自投装置中&#xff0c;以检查线路电压与母线电压的 相位差和幅值差。 2 主要性能 2 1采用进口集成电路和元器件构成&#xff0c;具有原理先进、性能稳定、可靠性高、动作值精…

电脑那个部件坏了或者是哪个软件需要修复来看价钱

电脑维修价格表是多少&#xff1f; 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多&#xff0c;而且会以各种奇怪的方式出现问题&#xff0c;下面我们就来看看具体的充电方法。 电脑维修价格表&#xff1a; 1. 重新安装系统。 安装XP系统通常需…

双指针、bfs与图论

1238. 日志统计 - AcWing题库 import java.util.*;class PII implements Comparable<PII>{int x, y;public PII(int x, int y){this.x x;this.y y;}public int compareTo(PII o){return Integer.compare(x, o.x);} }public class Main{static int N 100010, D, K;st…

XCode打包IOS应用发布App Store和Ad Hoc测试

文章目录 零、前置说明一、创建本地证书二、配置描述文件2.1 配置certificates2.1.1 配置证书2.1.2 安装cer证书2.1.2.1 打包机器和生成证书同机器2.1.2.2 打包机器和生成证书不同机器 2.2 创建Identifiers2.3 配置Devices2.4 配置Profiles2.4.1 配置生产Profile2.4.2 配置开发…

MATLAB:拟合与插值

一、关于多项式的基本操作 若要求非线性方程的根&#xff0c;则采用fzero, fminbnd函数 二、多项式拟合 clc, clear x0:0.2:10; y0.25*x20*sin(x); plot(x,y,k.,MarkerSize,15) grid on; hold on [p1,s1,mu1]polyfit(x,y,3); %3阶多项式拟合 y1polyval(p1,x,s1,mu1); [p2,s…

JAVA---学生管理系统

遍历字符串 ArrayList学习&#xff1a;

git:码云仓库提交以及Spring项目创建

git&#xff1a;码云仓库提交 1 前言 码云访问稳定性优于github&#xff0c;首先准备好码云的账户&#xff1a; 官网下载GIT&#xff0c;打开git bash&#xff1a; 查看当前用户的所有GIT仓库&#xff0c;需要查看全局的配置信息&#xff0c;使用如下命令&#xff1a; git …

关于数据通信知识的补充——第二篇

目录 四.二层交换机 5.实现不同vlan通信的原理 方法一&#xff1a;路由器网关 方法二&#xff1a;单臂路由 方法三&#xff1a;三层交换机 五.三层路由技术 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 …

220平现代风装修设计亮点分享,福州·名城银河湾。福州中宅装饰,福州装修

福州名城银河湾&#xff0c;220平现代风装修案例分享&#xff0c;以下是对这些设计亮点的详细分析&#xff1a; ①客厅木饰面背景墙&#xff0c;搭配灰橙撞色皮质沙发 客厅的木饰面背景墙与撞色皮质沙发的搭配&#xff0c;不仅提供了温馨舒适的氛围&#xff0c;还为空间增添了…

2核4G云服务器能支持多少人同时访问?性能测评来了

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

零知识玩转AVH(7)—— 门槛任务(2)所遇错误及解决(1)

接前一篇文章&#xff1a;零知识玩转AVH&#xff08;6&#xff09;—— 门槛任务&#xff08;1&#xff09;源码下载、编译及运行 上一回说到完成门槛任务 https://github.com/ArmDeveloperEcosystem/Paddle-examples-for-AVH &#xff08;推荐&#xff0c;内含 ML 视觉用例&am…

如何在Tomcat中的webapp中手动发布

这里写目录标题 首先进入Tomcat文件夹进入webaaps中,编写Java代码最后进入浏览器打开就看可以进入这个界面了 首先进入Tomcat文件夹 如图: 进入webaaps中, 编写Java代码 最后进入浏览器打开 就看可以进入这个界面了

【Spring Boot】创建你的第一个 Spring Boot 应用

创建你的第一个 Spring Boot 应用 1.环境配置2.步骤详解3.项目结构分析3.1 入口类 DemoApplication3.2 控制器 PathVariableController3.3 控制器 BasicController3.4 模型 User 4.运行 Spring Boot 目前已经成为了 Java 开发领域的框架范式。本篇博客&#xff0c;我将带领大家…

DataGrip 面试题及答案整理,最新面试题

DataGrip的数据库兼容性和多数据库支持如何实现&#xff1f; DataGrip实现数据库兼容性和多数据库支持的方式包括&#xff1a; 1、广泛的数据库支持&#xff1a; DataGrip支持多种数据库&#xff0c;包括但不限于MySQL, PostgreSQL, SQL Server, Oracle, SQLite, 和MongoDB&a…

前端学习之css选择器--基本选择器、关系选择器、属性选择器、复合选择器、伪类选择器

目录 基本选择器 结果 关系选择器 结果 父子关系 祖先后代关系 相邻兄弟关系 兄弟关系 ​编辑 属性选择器 结果 复合选择器 结果 伪类选择器 结果 伪类选择器-操作标签 结果 未访问 访问后 悬停 基本选择器 <!DOCTYPE html> <html lang"en"…

Java八股文(Git)

Java八股文のGit Git Git Git 是什么&#xff1f;它有什么作用&#xff1f; Git 是一种分布式版本控制系统&#xff0c;用于管理源代码的变更和追踪。 它可以记录文件更改的历史&#xff0c;帮助多人协同开发&#xff0c;并提供了回滚、分支管理等功能。 Git 和 SVN&#xff0…

数字电子技术实验(四)

单选题 1.组合逻辑电路中产生竞争冒险的原因是&#xff1f; A. 电路没有最简化 。 B. 时延 。 C. 电路有多个输出。 D. 逻辑门的类型不同。 答案&#xff1a;B 评语&#xff1a;10分 单选题 2.下列表达式不存在竞争冒险的有&#xff1f; 答案&#xff1a;A 评语&#x…

【b站咸虾米】2 Vue基础(下) 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址&#xff1a;【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 Vue基础 下 2.8 计算属性 2.8.1 计算属性使用 2.8.2 计算…