最大子序列-NlogN
2016-03-15 19:34
323 查看
//分治 #include<iostream> using namespace std; int MaxSubSum(int A[], int Left, int Right) { int MaxLeftSum, MaxRightSum; int MaxLeftBorderSum, MaxRightBorderSum; int LeftBorderSum, RightBorderSum; int Center; if(Left == Right) { if(A[Left] > 0) { return A[Left]; } else { return 0; } } Center = (Left + Right)/2; MaxLeftSum = MaxSubSum(A, Left, Center); MaxRightSum = MaxSubSum(A, Center+1, Right); MaxLeftBorderSum = LeftBorderSum = 0; for(int i = Center; i >= Left; --i) { LeftBorderSum += A[i]; if(LeftBorderSum > MaxLeftBorderSum) { MaxLeftBorderSum = LeftBorderSum; } } MaxRightBorderSum = RightBorderSum = 0; for(int i = Center+1; i <= Right; ++i) { RightBorderSum += A[i]; if(RightBorderSum > MaxRightBorderSum) { MaxRightBorderSum = RightBorderSum; } } if(MaxLeftSum > MaxRightSum) { if(MaxLeftSum > (MaxLeftBorderSum+MaxRightBorderSum)) return MaxLeftSum; else return MaxLeftBorderSum+MaxRightBorderSum; } else { return (MaxRightSum > (MaxRightBorderSum+MaxLeftBorderSum))?MaxRightSum:(MaxLeftBorderSum+MaxRightBorderSum); } } int main() { int A[] = {4, -3, 5, -2, -1, 2, 6, -2}; cout<<MaxSubSum(A, 0, 7); }
相关文章推荐
- 关于“只有注册用户登录后才能阅读该文”
- 20160310第一题
- 图像识别数据库
- hdoj 5641 King's Phone 【模拟】
- LinuxMySQL主从配置
- 网易2016年研发工程师编程题(1)
- Android Studio的*.9.png报错问题-Crunching Cruncher
- 使用vagrant安装linux环境
- Android依赖注入库Dagger的使用
- bzoj 2456: mode 【思维 求众数】
- A4988 步进电机加速控制算法的尝试(上)――arduino实现篇
- 如何将vector中的数据写入到txt中
- Codeforces 46D Parking Lot 枚举
- 【BZOJ1878】【codevs2307】HH的项链,莫队算法
- 最大子序列-N
- PAT 1025 反转链表 (25) 解题报告
- Gradle(ubuntu) 环境搭建
- ORACLE与.NET类型对应关系(转)
- Cisco/China Mobile的新网络架构
- bzoj 2463: [中山市选2009]谁能赢呢?【博弈】