hdu 1003(详解) java
算法分析:
一列数 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[100100]; int b[100100]; int c[100100]; int main() { int _case,n,i; scanf("%d",&_case); int js=0; while(_case--) { js++; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); b[0]=a[0]; c[0]=0; for(i=1;i<n;i++) { if(b[i-1]+a[i]<a[i]) { c[i]=i; b[i]=a[i]; } else { c[i]=c[i-1]; b[i]=b[i-1]+a[i]; } } int ed=0,max=b[0]; for(i=1;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]+1,ed+1); if(_case>0)printf("\n"); } return 0; }