动态规划(DP),递推,最大子段和,POJ(2479,2593)
2016-02-29 12:40
302 查看
题目链接:http://poj.org/problem?id=2479
解题报告:
1、再求left[i]的时候,先没有考虑a[i]的正负,先把a[i]放到left[i]中,然后left=max(left[i-1],left[i]);
2、res=max(res,left[i-1]+right[i]);
解题报告:
1、再求left[i]的时候,先没有考虑a[i]的正负,先把a[i]放到left[i]中,然后left=max(left[i-1],left[i]);
2、res=max(res,left[i-1]+right[i]);
#include <stdio.h> #include <algorithm> using namespace std; #define MAX 50005 int a[MAX]; int left[MAX]; int right[MAX]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); ///此时left[i]为包含a[i]最大子段和 left[0]=a[0]; for(int i=1;i<n;i++) { if(left[i-1]<0) left[i]=a[i]; else left[i]=left[i-1]+a[i]; } ///此时left[i]为i左边最大子段和 for(int i=1;i<n;i++) left[i]=max(left[i],left[i-1]); right[n-1]=a[n-1]; for(int j=n-2;j>=0;j--) { if(right[j+1]<0) right[j]=a[j]; else right[j]=right[j+1]+a[j]; } for(int j=n-2;j>=0;j--) right[j]=max(right[j],right[j+1]); int res=-100000000; for(int i=1;i<n;++i) res=max(res,left[i-1]+right[i]); printf("%d\n",res); } return 0; }
相关文章推荐
- OCR/Vote disk 维护操作: (添加/删除/替换/移动) (文档 ID 1674859.1) 转到底部转到底部
- js中单引号和双引号的区别
- [自定义组件之四]利用Quartz2D实现圆形图片显示
- 岁月无痕人有迹,时光无影人有踪
- Response.AddHeader实现下载_解决下载界面中文文件名乱码问题
- Item (Mage_Catalog_Model_Product) with the same id ”xxx“ already exist
- JDK5新特性之泛型
- 传入输入流即可将流中的数据转成String
- Android-性能优化、UI优化、代码优化(1)
- 【转】史上最全的CSS hack方式一览
- 当存放表决盘的磁盘组发生磁盘丢失时,启动CRS的步骤 (文档 ID 2055530.1)
- 个人介绍和GitHub
- JSON 之GSON 解析
- 23种设计模式
- 设计模式大全
- mysql优化之thread_cache_size
- 理解js中this的指向
- 谈谈HTTP/2对前端的影响【转载】
- Activity生命周期
- UE4自编译UE4Editor