• 网易云数据结构- Maximum Subsequence Sum


    题目


    题目地址

    思路


    显然是最大子列和的进化版,那就先思考下经典的最大子列和。这也是道思维题,啥算法也没用到,全是思维技巧,真心不知道考试遇到这种题该怎么办了。

    存放答案的一个类,我把它看成一个袋子,需要什么都可以“.”出来
    class ans
    {
    	static int maxsub = 0;
    	static int firstElement = 0;
    	static int lastElement = 0;
    	static int lastElementIndex = 0;
    }
    

    经典的最大子列和只是更新了maxsub,现在可以同时更新firstElement和lastElement,最后输出即可。

    这时更新一下
    		if (tempsum > ans.maxsub)
    			{
    				ans.lastElement = arr[i];
    				ans.firstElement = firstElement;
    				ans.maxsub = tempsum;
    			}
    以及
    这时更新一下
    	if (tempsum < 0)
    			{
    				if (i + 1 < arr.length)
    					firstElement = arr[i + 1];
    				tempsum = 0;
    			}
    对于为什么可以这样,我相信仔细思考一定能看懂。一定要先思考,再看答案,这样才能有共鸣。
    

    代码


    package 网易云数据结构;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.StreamTokenizer;
    import java.security.acl.LastOwnerException;
    import java.util.Scanner;
    
    public class Main
    {
    	public static void main(String[] args) throws IOException
    	{
    		StreamTokenizer in = new StreamTokenizer(new BufferedReader(
    				new InputStreamReader(System.in)));
    		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    		in.nextToken();
    		boolean isAllNegative = true;
    
    		// 读入k个数据
    		int k = (int) in.nval;
    		int arr[] = new int[k + 1];
    		for (int i = 1; i <= k; i++)
    		{
    			in.nextToken();
    			arr[i] = (int) in.nval;
    			if (arr[i] >= 0)
    			{
    				isAllNegative = false;
    			}
    		}
    
    		// 处理数据
    		int tempsum = 0;
    		int firstElement = arr[1];
    		for (int i = 1; i < arr.length; i++)
    		{
    			tempsum += arr[i];
    
    			if (tempsum > ans.maxsub)
    			{
    				ans.lastElement = arr[i];
    				ans.firstElement = firstElement;
    				ans.maxsub = tempsum;
    			}
    			if (tempsum < 0)
    			{
    				if (i + 1 < arr.length)
    					firstElement = arr[i + 1];
    				tempsum = 0;
    			}
    		}
    
    		// 输出
    		if (isAllNegative)
    		{
    			System.out.println(0 + " " + arr[1] + " " + arr[arr.length - 1]);
    		} else
    			System.out.println(ans.maxsub + " " + ans.firstElement + " "
    					+ ans.lastElement);
    	}
    }
    
    class ans
    {
    	static int maxsub = 0;
    	static int firstElement = 0;
    	static int lastElement = 0;
    	static int lastElementIndex = 0;
    }
    
  • 相关阅读:
    uva1220--树的最大独立集+判重
    UVA12186--树型DP
    HDU4171--bfs+树
    远程调用
    高并发业务
    wireshark
    将java程序打包成exe文件
    将博客搬至CSDN
    Mysql分区
    MogileFS
  • 原文地址:https://www.cnblogs.com/sundy-lee/p/5241328.html
Copyright © 2020-2023  润新知