其他分享
首页 > 其他分享> > 2021春季美团第九次笔试第三题

2021春季美团第九次笔试第三题

作者:互联网

题目:

小美请小团吃回转寿司。转盘上有N盘寿司围成一圈,第1盘与第2盘相邻,第2盘与第3盘相邻,…,第N-1盘与第N盘相邻,第N盘与第1盘相邻。小团认为第i盘寿司的美味值为A[i](可能是负值,如果小团讨厌这盘寿司)。现在,小团要在转盘上选出连续的若干盘寿司,使得这些寿司的美味值之和最大(允许不选任何寿司,此时美味值总和为0)。

 

题目要求环形数组的连续子数组的最大和,我们先不要去管数组是环形的情况,利用动态规划求解连续子数组的最大和以及最小和。 (1) 不考虑环形得到的最大值:题中允许寿司首尾相连的环形数组情况,因此常规求得的连续子数组的最大和就是我们排除这种情况之外的所有情况中的最大和。 (2) 只考虑环形得到的最大值:而对于首尾相连的情况,我们可以这样考虑,如果常规求得的连续子数组的和达到了最小,那么总和减去这个最小值就等于首尾相连情况的最大值了。 因此最大的美味值就是(1)和(2)两种情况中大的那个。

代码:

 1 import java.io.*;
 2 import java.io.IOException;
 3 
 4 /**
 5  * @author zcy
 6  * @date 2021年04月03日 13:09
 7  */
 8 public class Main1 {
 9     public static void main(String[] args) throws IOException{
10 
11         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
12         String str = br.readLine();
13         int t=Integer.parseInt(str);
14         while(t-->0){
15             str= br.readLine();
16             int n=Integer.parseInt(str);
17             String[] str1=br.readLine().split(" ");
18             int[] A=new int[n];
19             int i=0;
20             int sum=0;
21             for (String temp:str1){
22                 A[i]=Integer.parseInt(temp);
23                 sum+=A[i++];
24             }
25 
26             int max=0;
27             int dpmax=0;
28             int min=0;
29             int dpmin=0;
30             for(int j=1;j<n;j++){
31                 dpmax=Math.max(A[j],dpmax+A[j]);
32                 max=Math.max(dpmax,max);
33                 dpmin=Math.min(A[j],dpmin+A[j]);
34                 min=Math.min(dpmin,min);
35             }
36             System.out.println(Math.max(max,sum-min));
37         }
38 
39     }
40 }

 

标签:String,str,寿司,int,第九次,美团,br,2021,数组
来源: https://www.cnblogs.com/SEU-ZCY/p/14614156.html