博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2479(DP)
阅读量:6082 次
发布时间:2019-06-20

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

题目链接:https://vjudge.net/problem/POJ-2479

题意:给出n个数组成的序列,求将序列分成前后两部分时两部分最大连续子串的和的和的最大值。

思路:题意很简单,用dp1[i]表示以i为结尾的最大连续子串的和,dp2[i]表示以i为起始的最大连续子串的和,从1到n遍历计算出dp1,从n到1遍历计算出dp2。遍历同时维护数组Max1[i],Max2[i],分别表示[1,i]区间最大连续子串和,[i,n]区间最大连续子串和。最后遍历一遍找到Max1[i]+Max[i+1]的最大值即可。需要注意的是a[i]可能为负值,所以ans应初始化为0xcfcfcfcf。

AC代码:

#include
#include
using namespace std;int T,n,a[50005],dp1[50005],dp2[50005],Max1[50005],Max2[50005];int ans;int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); dp1[1]=a[1],dp2[n]=a[n]; Max1[1]=a[1],Max2[n]=a[n]; for(int i=2;i<=n;++i){ dp1[i]=max(dp1[i-1]+a[i],a[i]); Max1[i]=max(Max1[i-1],dp1[i]); } for(int i=n-1;i>=1;--i){ dp2[i]=max(dp2[i+1]+a[i],a[i]); Max2[i]=max(Max2[i+1],dp2[i]); } ans=0xcfcfcfcf; for(int i=1;i
ans) ans=Max1[i]+Max2[i+1]; printf("%d\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10837538.html

你可能感兴趣的文章
jspsmart 支持jdk1.4 解决utf-8编码时出现乱码的问题 附源码和jar包
查看>>
我的友情链接
查看>>
把LYNC从评估版升级到正式版
查看>>
我的友情链接
查看>>
eclipse 不能建立maven项目
查看>>
Session死亡讲解
查看>>
八周三次课(1月31日)
查看>>
我的友情链接
查看>>
关于linux中 变量相关 学习小白总结
查看>>
文德数据启动国庆中秋大优惠——现在购买立省三千
查看>>
每天一个python 小案例——循环和列表
查看>>
结构体/struct
查看>>
用VC++开发Oracle数据库应用程序详解
查看>>
CCS初学那点事(二)
查看>>
机器学习:数据预处理之独热编码(One-Hot)
查看>>
我的友情链接
查看>>
apache之虚拟主机
查看>>
dedeCMS5.7在任意栏目获取顶级栏目名称及链接的方法
查看>>
linux之文本搜索工具(grep、egrep)用法
查看>>
活动目录中组的类型和可用范围
查看>>