栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

PAT 甲级 1007 Maximum Subsequence Sum (25 分)(Java)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PAT 甲级 1007 Maximum Subsequence Sum (25 分)(Java)

文章目录
  • PAT 甲级 1007 Maximum Subsequence Sum (25 分)(Java)
    • 题目
    • 题意解读
    • 解题思路
    • 解法
      • 解法一
      • 解法二

PAT 甲级 1007 Maximum Subsequence Sum (25 分)(Java) 题目

题目链接

题意解读

这题是经典的动态规划题:最大连续子序列和,这题多出来的就是如何存储这个最大子序列和的起始点和终点;

解题思路

这题可以首先写出最基础的最大连续子序列和,然后在此基础上思考如何通过一定的数据结构保存最大连续子序列和的起点和终点;

需要注意的是:

  1. 这题使用Scanner输入会超时,所以需要使用StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)))进行输入;
  2. 若整个数组全部是负数,输出的最大子序列和是0,且输出序列的首尾的数字;
解法 解法一
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        sc.nextToken();
        int n = (int)sc.nval + 1;
        int[] d = new int[n];
        for(int i=1; i 0){
                dp[i] = dp[i-1] + d[i];
                num[i] = num[i-1];
            }else{
                dp[i] = d[i];
                num[i] = i;
            }
            if(dp[i] > max){
                max = dp[i];
                start = num[i];
                end = i;
            }
        }
        if(max < 0){
            System.out.println(0 + " " + d[1] + " " + d[n-1]);
        }else{
            System.out.println(max + " " + d[start] + " " + d[end]);
        }
    }
}

如果想看最大连续序列和,只要将上述代码的num数组全部去掉即可;

解法二

可以在解法一的基础上进行空间优化;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        sc.nextToken();
        int n = (int)sc.nval + 1;
        int[] d = new int[n];
        for(int i=1; i max){
                max = temp;
                start = tempIndex;
                end = i;
            }
        }
        if(max < 0){
            System.out.println(0 + " " + d[1] + " " + d[n-1]);
        }else{
            System.out.println(max + " " + d[start] + " " + d[end]);
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/343207.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号