hdu 1003(详解) java

时间:2020-12-23 07:04:40

算法分析:

  一列数   a[0],a[1],……a[i]……

  定义数组b[0],b[1,]……b[i]……

***b[i]为i之前的任意位置到i的最大连续和!!!

b[i]=max{b[i-1]+a[i],a[i]}

package Main;

import java.util.Scanner;

public class Main {
public static void main(String[] args)
{
int _case,n,i;
int []a=new int [100100];
int []b=new int [100100];//dp
int []c=new int [100100];//记录下标
Scanner cin=new Scanner(System.in);
_case=cin.nextInt();
int js=0;
while(_case-->0)
{
js++;
n=cin.nextInt();
for(i=0;i<n;i++)
{
a[i]=cin.nextInt();
}
b[0]=a[0];
c[0]=0;
for(i=1;i<n;i++)
{
if(b[i-1]+a[i]<a[i])
{
b[i]=a[i];
c[i]=i;
}
else
{
b[i]=b[i-1]+a[i];
c[i]=c[i-1];
}
}
int ed=0;
int max=b[0];
for(i=1;i<n;i++)
{
if(max<b[i])
{
max=b[i];
ed=i;
}
}
System.out.println("Case "+js+":");
System.out.println(max+" "+(c[ed]+1)+" "+(ed+1));
if(_case>0)System.out.println();
}
}
}

注意输出格式, Output a blank line between two cases.

#include<stdio.h>
int a[];
int b[];
int c[];
int main()
{
int _case,n,i;
scanf("%d",&_case);
int js=;
while(_case--)
{
js++;
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&a[i]);
b[]=a[];
c[]=;
for(i=;i<n;i++)
{
if(b[i-]+a[i]<a[i])
{
c[i]=i;
b[i]=a[i];
}
else
{
c[i]=c[i-];
b[i]=b[i-]+a[i];
}
}
int ed=,max=b[];
for(i=;i<n;i++)
{
if(max<b[i])
{
max=b[i];
ed=i;
}
}
printf("Case %d:\n",js);
printf("%d %d %d\n",max,c[ed]+,ed+);
if(_case>)printf("\n");
}
return ;
}