nyoj 174Max Sequence&poj 2593(dp)

考察点:动态规划

  思路:虽然题目给出了3000ms的时间,但考虑到数据量可以达到100000,如果用O(N^2)的算法的话,还是极有可能会超时的,于是决定采用这种O(N)时间效率的动规。在输入的同时,进行一次DP,计算出从左到右的最大值,并把它保存在数组dp的对应的下标元素中,这样之后,对于下标为i 的元素,它其中保存的便是前面所有元素可能的最大连续和。再从右到左进行一次DP,计算从右到左的最大连续和。假设此时已经算到下标为i的元素,那么将 sum+dp[i-1]与ans进行比较,将ans取较大者。

import java.util.Scanner;
public class Main {
	
	public static void main(String[] args) {
	  Scanner scanner=new Scanner(System.in);
	  while(scanner.hasNext())
	  {
		 int number=scanner.nextInt();
		 if(number==0)break;
		 int result[]=new int[number];
		 int dp[]=new int[number];
		 int max=-999,sum1=0;
		 for(int i=0;i<number;i++)
		 {
			 result[i]=scanner.nextInt();
			 sum1+=result[i];
			 if(sum1>max)
				 max=sum1;
			 dp[i]=max;
			 if(sum1<0)
				 sum1=0;
		 }
		 
		 int sum2=0,answer=-999;
		 for(int i=number-1;i>0;i--)
		 {
			 sum2+=result[i];
			 if(dp[i-1]+sum2>answer)
				 answer=dp[i-1]+sum2;
			 if(sum2<0)
				 sum2=0;
		 }
		 System.out.println(answer);
	  }
	}
}
                        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值