问题描述 就是输入n 然后输入n个数 下标为1~n 然后查询 查询次数不知道 但是以0 0 作为结束的标志 查询为l r 就是输出[l,r]区间的和
//这事朴素的求数组区间和的问题
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner input=new Scanner(System.in);//作为输入数据的标示
final int maxl=10000;//这里定义是为了数组的动态输入
int[] a=new int[maxl];
int[][] b=new int[maxl][maxl];
int n=input.nextInt();//这是输入一个整数的函数 另外可以自学一下这个输入流的函数都有哪些
for(int i=1;i<=n;i++) a[i]=input.nextInt();//输入n个数
int sum;//这里借助额外的变量来辅助 复杂度为n*n 当n太大的时候需要我们去用数据结构来把复杂度降低为nlog(n) 这个我们后期再说
for(int i=1;i<=n;i++){
sum=0;
for(int j=i;j<=n;j++){
sum+=a[j];
b[i][j]=sum;
}
}
int l,r;
while(true){
l=input.nextInt();
r=input.nextInt();
if(l==0&&r==0) break; //在没有做其它的操作之前就要先判断 因为要是0 0的话就直接退出了
System.out.println(b[l][r]);
}
input.close();//关闭输入流
}
}
//这是求一个数组的最大子数组最大和的问题 就是连续和最大 不要以为所以得数加起来最大 万一有负数呢
import java.util.Scanner;
public class fibonacci {
public static void main(String args[]){
Scanner input=new Scanner(System.in);//作为输入数据的标示
final int maxl=10000;//这里定义是为了数组的动态输入
int[] a=new int[maxl];
int[][] b=new int[maxl][maxl];
int n=input.nextInt();//这是输入一个整数的函数 另外可以自学一下这个输入流的函数都有哪些
for(int i=1;i<=n;i++) a[i]=input.nextInt();//输入n个数
int l=1,r=1,k=1;//这里假定的初始下标都是从1开始的 然后k只是一个辅助变量
int max=-9999,temp=0;//初始的时候一个都没有加 temp为0 这里把max赋值一个很小的数是因为保证数组中的数没有比它还小的
for(int i=1;i<=n;i++){
temp+=a[i];
if(temp>max){ //这里表示加了之后它的值变大了 所以这个就直接加入
r=i;//r是一直跟着上面的i往前走的
l=k;//这里的话就是等于经过k处理过的左边界
max=temp;//同时更新最大值
}
else if(temp<0){//发现连续和有负数的 那么还不如不加
temp=0; //所以就直接不加
k=i+1; //这里的下标要边 把前面记录的下标都抛弃
}
}
System.out.println("最大值为 "+max+" 左下标 "+l+" 右下标 "+r);
input.close();//关闭输入流
}
}