dp学习——最大字段和
2016-03-07 18:59
218 查看
输入
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9)
输出
输出最大子段和。
输入示例
6
-2
11
-4
13
-5
-2
输出示例
20
这道题也可以用二重循环、三重循环做,但用dp可以更有效的得到解,dp数组的含义:定义dp[i]为输入的以a[i]结尾的最大字段和。
状态转移方程为
dp[0] = a[0],
dp[i] = Max(a[i],a[i]+dp[i-1])
note:如果dp[i-1]是负数,那么dp[i]直接取a[i],否则就令dp[i]=dp[i-1]+a[i]
要注意的一个细节是如果题目的输入数据可能很大,累加求和后可能会超出int的范围,所以用了long。
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9)
输出
输出最大子段和。
输入示例
6
-2
11
-4
13
-5
-2
输出示例
20
这道题也可以用二重循环、三重循环做,但用dp可以更有效的得到解,dp数组的含义:定义dp[i]为输入的以a[i]结尾的最大字段和。
状态转移方程为
dp[0] = a[0],
dp[i] = Max(a[i],a[i]+dp[i-1])
note:如果dp[i-1]是负数,那么dp[i]直接取a[i],否则就令dp[i]=dp[i-1]+a[i]
要注意的一个细节是如果题目的输入数据可能很大,累加求和后可能会超出int的范围,所以用了long。
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); long[] nums = new long[n+10] , dp = new long[n+10]; for(int i=0;i<n;i++) nums[i] = in.nextInt(); long ans = dp[0] = nums[0]; for(int i=1;i<n;i++){ dp[i] = Math.max(nums[i], dp[i-1]+nums[i]); if(ans<dp[i]) ans = dp[i]; } System.out.println(ans); } } }
相关文章推荐
- php魔术方法——属性重载方法
- 出差(十三)
- CODE[VS] 1068 乌龟棋
- 基础7
- Java线程栈的获取和分析
- pat1003:我要通过!
- 高级语言的编译:链接及装载过程介绍
- HUST 1599 (找规律)
- 获取腾讯企业邮箱通讯录python脚本(带登录功能)
- git学习
- Linux Vi 删除全部内容,删除某行到结尾,删除某段内容 的方法
- SoupUI Pro返回乱码
- WP系统推广难的原因之中的一个之我见
- os send,receive 实现
- [Java语言] HashMap,HashSet,Hashtable,Vector,ArrayList 的关系 <转>
- win10如何让她闭嘴、按什麽建系统都要说话、如何让她闭嘴?
- HDOJ-1754 I Hate It
- 公共技术点之 Java 反射 Reflection
- c++编译器对多态的实现原理总结
- Linux 如何查看进程的各线程的CPU占用