博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大子序列和 HDOJ 1003 Max Sum
阅读量:4358 次
发布时间:2019-06-07

本文共 1216 字,大约阅读时间需要 4 分钟。

 

题意:求MCS(最大连续子序列和)及两个端点

分析:第一种办法:dp[i] = max (dp[i-1] + a[i], a[i]) 可以不开数组,用一个sum表示前i个数字的MCS,其实是一样的。。。类似DP的做法有个名字叫。

   第二种办法:一个前缀记录前i个数字的和,那么ans = sum - mn; mn表示前j个和且和最小

   两种办法都是O (n) 1003就这么难?? 推荐学习资料:

 

收获:MCS问题的两种o (n) 的算法,且还有递归的解法 O (nlogn)

 

代码1:

#include 
#include
#include
using namespace std;const int N = 1e6 + 10;const int INF = 0x3f3f3f3f;int a[N];//O (n)void MCS(int n) { int l = 0, ll = 0, rr = 0; int sum = -INF, mx = -INF; for (int i=1; i<=n; ++i) { if (sum + a[i] < a[i]) { sum = a[i]; l = i; } else sum += a[i]; if (sum > mx) { mx = sum; ll = l, rr = i; } } printf ("%d %d %d\n", mx, ll, rr);}int main(void) { int T, cas = 0; scanf ("%d", &T); while (T--) { int n; scanf ("%d", &n); for (int i=1; i<=n; ++i) scanf ("%d", &a[i]); printf ("Case %d:\n", ++cas); MCS (n); if (T) puts (""); } return 0;}

 

代码2:

//O (n) //anothervoid MCS(int n)	{	int l = 0, ll = 0, rr = 0;	int sum = 0, mx = -INF, mn = 0;	for (int i=1; i<=n; ++i)	{		sum += a[i];		if (sum - mn > mx)	{			mx = sum - mn;	ll = l;	rr = i;		}		if (sum < mn)	{			mn = sum;	l = i;		}	}	printf ("%d %d %d\n", mx, ll + 1, rr);}

 

转载于:https://www.cnblogs.com/Running-Time/p/4719011.html

你可能感兴趣的文章
Android资源--颜色RGB值以及名称及样图
查看>>
ORA-32001:write to SPFILE requested but no SPFILE is in use
查看>>
PhysX入门教程(全)
查看>>
ASP.NET XML与JSON
查看>>
java.lang.Class.getResource()这哥个方法主要是做什么用
查看>>
Codeforces 948D Perfect Security 【01字典树】
查看>>
android中通过ServerSocket创建端口问题
查看>>
fieldset、legend、display html元素
查看>>
IntelliJ IDEA 14.x 与 Tomcat 集成,创建并运行Java Web项目
查看>>
JavaWeb学习-Tomcat
查看>>
MySQL 事务与锁机制
查看>>
优秀程序员==工作时间长的程序员么?
查看>>
docker学习笔记2:容器操作
查看>>
深入浅出设计模式——访问者模式(Visitor Pattern)
查看>>
【转载】zookeeper 分布式锁 实现
查看>>
SQL语法
查看>>
Django(三) ORM 数据库操作
查看>>
【转】iOS静态库 【.a 和framework】【超详细】
查看>>
【转】Android中自定义控件的步骤
查看>>
软件测试工作中的沟通问题
查看>>