HDU 1003 Max Sum

本文详细解析了一道经典的最大子段和问题,不仅介绍了如何求解最大子段和,还给出了确定最大子段起始与结束位置的方法,并附带源代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题就是一道最大子段和问题,经典dp问题,只不过它不仅要你求出最大子段和,还要求你给出最大段的起始位置与结尾位置。
最大子段和就是基于递推公式 f[j]=max(f[j-1]+a[j],a[j]),至于结尾位置我们只需要在求解f数组的过程中用一个End变量记录一下即可,若此时的f[j]最大,则令End=j,而起始位置则是在得知结尾位置之后,利用结尾位置推出起始位置,至于怎样推,我这里给出两种方法。
方法一:从End位置往前累加a数组的值,如果当前累加的总和等于最大子段和就修改Start变量的值,直到遍历到a数组的第一个元素。

方法二:根据我们对f数组的定义以及递推公式可知,f数组中位于最大子段和区间内的每个元素的值均大于等于0,因此从End位置往前遍历f数组,当遇到一个小于0的值跳出即可,Start最后保存的那个值即为最大子段和的起始位置。
本来这道题就是一道裸的最大子段和问题,没什么难度,但是我wa了许多发,后来究其原因,是因为我在定义Start,End这两个变量之后,在利用循环寻找他们之前没有给他们赋初始值,因此这道题给我的一个很大的启发是:如果我们定义了某个变量,在if语句中给他们赋值,那么我们就要小心如果他不符合判断条件那么最终他很可能就没有值了(如果之前你没有对他进行初始化的话),所以我们以后在定义变量以后,最好在某处对变量进行初始化(不一定非要在定义的时候初始化)。
下面贴代码:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define PI acos(-1.0)
#define seed 31//131,1313
#define MAXV 50010
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int MAXN=100000+5;
int a[MAXN];
int f[MAXN];
int main()
{
    int t,n;
    int j,k;
    scanf("%d",&t);
    k=1;
    while(t--){
        scanf("%d",&n);
        for(j=1;j<=n;j++){
            scanf("%d",&a[j]);
        }
        f[1]=a[1];
        int maxsum=f[1];
        int Start,End=1;
        for(j=2;j<=n;j++){
            f[j]=max(f[j-1]+a[j],a[j]);
            if(f[j]>maxsum){
                maxsum=f[j];
                End=j;
            }
        }
        Start=End; //一定要对Start赋初始值,否则必wa
        j=End;
        while(f[j]>=0&&j>0){
            Start=j;
            j--;
        }
        //int p=0;
//        Start=End;
//        for(j=End;j>0;j--){
            p+=a[j];
            if(p==maxsum) Start=j;
//        }
        printf("Case %d:\n",k++);
        printf("%d %d %d\n",maxsum,Start,End);
        if(t) printf("\n");
    }
    return 0;
}
内容概要:本文档介绍了Intel oneAPI工具集及其行业倡议,旨在提供跨架构编程解决方案,支持加速计算并打破专有锁定。oneAPI允许开发者选择最佳硬件加速技术,实现跨CPU、GPU、FPGA及其他加速器的性能优化。它兼容多种编程语言模型(如C++、Python、SYCL、OpenMP等),并通过开放标准确保未来兼容性代码重用。文档详细描述了oneAPI工具包的功能,包括渲染、高性能计算(HPC)、物联网(IoT)、AI分析等领域的应用。此外,还介绍了DPC++(数据并行C++)编程语言及其在不同硬件架构上的执行方式,以及Intel提供的各种优化库分析工具,如Intel MKL、IPP、VTune Profiler等。最后,通过实际案例展示了oneAPI在医疗成像超声产品中的成功应用。 适合人群:软件开发人员、硬件工程师、系统架构师、OEM/ODM厂商、ISV合作伙伴,特别是那些需要在多种硬件平台上进行高效编程性能优化的专业人士。 使用场景及目标:①为跨架构编程提供统一的编程模型,简化多硬件平台的应用开发;②利用开放标准工具集,提高代码可移植性重用性;③通过优化编译器技术库,提升应用程序的性能表现;④借助分析调试工具,快速识别并解决性能瓶颈。 其他说明:Intel oneAPI工具集不仅支持现有编程语言模型,还提供了强大的中间件框架支持,适用于多样化的应用负载需求。开发者可以通过Intel DevCloud获取实际操作经验,同时利用DPC++兼容性工具将现有CUDA代码迁移到SYCL环境。此外,文档还提供了详细的性能优化指南未来产品路线图,帮助用户更好地规划技术演进路径。
“班级网站设计源代码”项目是网页设计初学者及有一定基础的设计师的理想学习资源。它提供了完整的源代码,涵盖构建可运行班级网站所需的所有文件。网页设计包含前端开发、后端开发用户体验设计等多个方面,而这个项目能帮助你深入理解这些技术的实际应用。 首先,HTML是网页的基础,它通过标签定义网页的结构,如标题、落、图片链接等。在这个项目中,你可以清晰地看到如何利用HTML搭建网页的框架。其次,CSS用于控制网页的样式布局,赋予网页视觉美感。通过设置颜色、字体、布局以及响应式设计,CSS确保网站能在不同设备上良好显示。项目中的源代码展示了如何运用CSS实现多样化的样式效果。 JavaScript则是实现网页动态功能的关键,它能够处理用户交互、数据操作动画效果。在这个班级网站中,JavaScript代码可能用于实现按钮点击事件、表单验证或页面动态更新等功能。此外,响应式设计是现代网页设计的重要组成部分。借助媒体查询流式布局,该班级网站能够自动适应手机、平板桌面电脑等不同设备的屏幕尺寸。 为了提高开发效率,现代网页设计常常会引入前端框架库,如Bootstrap或Vue.js。这些工具提供了一套预设的样式组件,简化了网页的构建过程。虽然具体是否使用了这些框架需要查看源代码,但了解它们的工作原理对于提升网页设计能力至关重要。 如果班级网站包含用户登录、留言等功能,那么后端技术(如PHP、Node.js或Python)数据库(如MySQL或MongoDB)也会被涉及。这部分代码主要负责处理数据的提交、验证存储,以及与服务器的通信。 用户体验(UX)界面设计也是网页设计的重要方面。一个优秀的网站不仅要有美观的外观,还要具备良好的易用性。通过观察分析这个班级网站的布局交互设计,你可以学习如何提升用户体验,例如如何设计清晰的导航、易读的信息直观的操作流程。 通过深入研究“
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值