最大子序列和分治算法
2015-10-05 14:55
176 查看
#include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> #include<map> #include<memory.h> //#define ONLINE_JUDGE #define eps 1e-8 #define INF 0x7fffffff //INT_MAX #define inf 0x3f3f3f3f //int?????????????????? #define FOR(i,a) for((i)=0;i<(a);(i)++) //[i,a); #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfI(a) printf("%I64d\n",a) #define pfs(a) printf("%s\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define sft(a,b,c)scanf("%d%d%d",&a,&b,&c) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define for3(i,a,b)for(int i=(b);i>=a;i--) #define MEM1(a) memset(a,0,sizeof(a)) #define MEM2(a) memset(a,-1,sizeof(a)) #define LL __int64 const double PI = acos(-1.0); template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; } template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; } template<class T> inline T Min(T a, T b) { return a < b ? a : b; } template<class T> inline T Max(T a, T b) { return a > b ? a : b; } using namespace std; template<class T> T Mint(T a, T b, T c) { if (a>b) { if (c>b) return b; return c; } if (c>a) return a; return c; } template<class T> T Maxt(T a, T b, T c) { if (a>b) { if (c>a) return c; return a; } else if (c > b) return c; return b; } int FindCrossMid(int low, int high, int mid, int A[]) { int leftsum = INT_MIN;//左边最大和 int sum1 = 0; int leftindex;//取左边最大和时数组的下标 for (int i = mid; i >= low; i--) { sum1 += A[i]; if (sum1>leftsum) { leftsum = sum1;//更新最大和 leftindex = i;//更新数组下标 } } int rightsum = INT_MIN;//右边最大和 int sum2 = 0; int rightindex;//取右边最大和时数组的下标 for (int i = mid+1; i <= high; i++) { sum2 += A[i]; if (sum2>rightsum) { rightsum = sum2;//更新最大和 rightindex = i;//更新数组下标 } } return leftsum + rightsum;//返回最大和 } int FindMaxSubsequence(int low, int high, int A[]) { if (high == low) return A[low]; else { int mid = (low + high) / 2; int leftsum, rightsum, crosssum; leftsum = FindMaxSubsequence(low, mid, A);//左半部最大子序列和 rightsum = FindMaxSubsequence(mid+1, high, A);//右半部最大子序列和 crosssum = FindCrossMid(low, high, mid, A);//中间最大子序列和 if (leftsum>crosssum&&leftsum>rightsum) return leftsum; else if (rightsum>leftsum&&rightsum>crosssum) return rightsum; else return crosssum; } } int main() { int A[100]; int n; sf(n); for1(i, 0, n) sf(A[i]); cout << FindMaxSubsequence(0, n-1, A) << endl; system("pause"); return 0; }
相关文章推荐
- java基础----foreach
- Java多线程14:生产者/消费者模型
- Spring MVC 学习笔记(二) 基于spring2.5注解实现的spring MVC项目
- 喜马拉雅手机客户端 分析
- "数据结构翻转课堂"答疑实录——链表
- 通过SSL中间人证书和钓鱼WIFI监听密码演示
- Spring MVC中使用Interceptor拦截器
- Asp.net 视频摘要
- BZOJ1053: [HAOI2007]反素数ant
- break 和 return 和 continue
- mininet error: Cannot find required executable ovs-controller.
- GOF 23 设计模式之 观察者模式(Observer)
- ISO/IEC 9899:2011 条款6.5.16——赋值操作符
- 【C++学习】fstream的使用方法介绍
- Android 自定义RadioButton 实现文字上下左右方向的图片大小设置
- BZOJ 1834 ZJOI2010 network 网络扩展 Dinic+EK费用流
- [BNU弱校联萌]厉兵秣马
- 补题列表
- PHP随笔
- Android开发最佳实践