最大连续子序列之和
来源:互联网 发布:火烧赤壁的网络意思 编辑:程序博客网 时间:2024/05/18 23:13
参考 http://blog.csdn.net/sgbfblog/article/details/8032464
刚开始只想到用枚举,但很慢。
没有想到用分治,虽然也比较慢。
学习之后写了一下动态规划的代码。
dp[i]表示包含a[i]在内的前i个数里最大连续子序列和
设置r, l 表示左右节点
设置 z,y 表示最长序列左右节点。
dp[i-1]<0时,舍弃,重新开始,令dp[i]=a[i]
dp[i-1]>=0时,dp[i]=dp[i-1]+a[i]
每轮比较当前dp[i]和max,随时更新。
全部初始化为1,重新开始时更新l,r为i,正常前进时只更新r为i,需要更新max时把当前l,r给z,y。
多组输入,输入0时结束。
输出最大序列和及起始终止位置。
代码如下
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int a[100] ;
int dp[100] ;
int main()
{
int i,n;
while (scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int r = 1,l = 1,z =1 ,y = 1;
int maxn = 0;
int b = 0;
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
for (int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
maxn = a[1];
dp[1] = a[1];
for(int i = 2; i <= n; i++)
{
if(dp[i-1] < 0)
{
dp[i] = a[i];
l = i;
r = i;
}
else
{
dp[i] = dp[i-1] + a[i];
r = i;
}
if(dp[i] > maxn)
{
maxn = dp[i];
z = l;
y = r;
}
}
printf("%d %d %d\n",maxn,l,r);
}
return 0;
}
- 最大连续子序列之和
- 最大连续子序列之和
- 最大连续子序列之和
- 最大连续子序列之和
- 最大连续子序列之和
- 最大子连续序列之和
- 最大连续子序列之和
- 最大连续子序列之和,最大连续子序列乘积
- 计算最大连续子序列之和
- 输出最大连续子序列之和
- 最大连续子序列之和的问题
- 连续子序列之和
- 最大连续子序列之和(动态规划)
- 求最大连续子序列之和 立方算法
- 算法进化历程之“最大连续子序列之和”
- 算法之最大连续子序列之和之变形题目
- 最大连续子序列之和 动态规划 java
- 最大连续子序列之和算法进化历程
- 内存泄漏
- 面向对象的java,一切对象的起源Object
- SpringMVC学习记录(七)--拦截器的使用
- python基础学习(4)—数据类型
- js-浅析this指向
- 最大连续子序列之和
- springboot支持jsp页面
- cnpm不是内部命令的解决方案:配置环境变量
- 第四次小组讨论 (代码规范)
- 大数据环境搭建
- PyQt5学习笔记6_QTableView中嵌入按钮
- Hello World!
- hdu5319 Painter(模拟题)
- 省选专练ZJOI2004书架