luogu1115 最大子段和(递推/分治)
来源:互联网 发布:战舰世界淘宝商城 编辑:程序博客网 时间:2024/05/17 06:31
一直记着之前得到的能接着连下去的最大值tmp,始终更新答案ans。
#include <cstdio>#include <cstring>#define N 200000#define inf 0x3f3f3f3fint n,ans=-inf,tmp=-inf;inline int max(int x,int y){return x>y?x:y;}int main(){// freopen("a.in","r",stdin); scanf("%d",&n); while(n--){ int x; scanf("%d",&x); tmp=max(tmp+x,x); ans=max(ans,tmp); } printf("%d\n",ans); return 0;}
以前还写过一个分治。
#include<cstdio>#include<cstring>int n,a[200001];int findcrossmax(int low,int mid,int high){ int sum=0,leftsum=0x80000000,rightsum=0x80000000; for(int i=mid;i>=low;i--){ sum+=a[i]; if(sum>leftsum) leftsum=sum; } sum=0; for(int i=mid+1;i<=high;i++){ sum+=a[i]; if(sum>rightsum) rightsum=sum; } return rightsum+leftsum;}int findmax(int low,int high){ if(low==high) return a[low]; int mid=(low+high)/2; int lsum=findmax(low,mid); int rsum=findmax(mid+1,high); int csum=findcrossmax(low,mid,high); if(lsum>=rsum&&lsum>=csum) return lsum; else if(rsum>=csum) return rsum; else return csum;}int main(){ //freopen("a.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("%d",findmax(1,n)); return 0;}
阅读全文
0 0
- luogu1115 最大子段和(递推/分治)
- 51Nod 1049 最大子段和(分治/dp)
- 最大子段和-分治&&动态规划
- 分治法求最大子段和
- 分治法求最大子段和
- 计算最大子段(分治法)
- 最大子段和——分治与动态规划
- 最大子段和——分治与动态规划
- 最大子段和——分治与动态规划
- 最大子段和——分治与动态规划
- 最大子段和——分治与动态规划
- 最大子段和——分治与动态规划
- 算法设计与分析之-最大子段和 (分治)
- 51nod 1049 最大子段和(分治 dp)
- 最大子段和(分治与动态规划典例)
- 最大子段和问题(暴力 分治 动规)
- 最大子段和——分治与动态规划
- 最大子段和(分治与动态规划典例)
- mysql好书推荐
- iOS展示超大图片或超高分辨率图片崩溃解决方法
- 使用SecureCRT连接Linux时,alt + .等功能键不能使用的解决办法
- 如何判断一个二叉树是否为另一个二叉树的子树
- Android Studio如何关联github以及如何维护md文件
- luogu1115 最大子段和(递推/分治)
- iOS|开发小技巧之UIView创建xib
- XCTest/XCTest.h file not found
- Spring 顾问 代理增强
- Python模块导入原理剖析
- B-tree/B+tree/B*tree
- JVM学习笔记—JVM的一些基本概念
- 数组、继承
- 【C教程】怎么使用VS2015入门C语言?VS2015怎么写