首页 > 代码库 > poj 2479 Maximum sum
poj 2479 Maximum sum
题意:求一段整数序列任意两端不相交的串的和的最大值。
题目思路:用dp动态规划,先开辟一个标志数组从左到右分别记录每一段序列和的最大值,再从右到左分别根据已经记录好的标志数组计算最大和的值。
#include<iostream> #include<stdio.h> using namespace std; int flag[50001],num[50001];//两个数组分别记录最大和和这个整数序列 const int MIN=-999999999; int main(){ int n; int ans,i,j; int sum,temp; int per; cin>>n; while(n--){ sum=0,temp=MIN; cin>>per; for(i=1;i<=per;i++){//从左到右 scanf("%d",&num[i]); sum+=num[i]; if(sum>temp) {temp = sum;}//分别选出1~i段的最大和,只有所有元素相加的和大于原来的最大和才更新这个最大和 flag[i]=temp; if(sum<0) sum=0;//如果sum出现了负数,就抛弃这一段 } sum=0; ans=MIN; temp=MIN; for(j=per;j>1;j--){//从右到左 sum+=num[j]; if(sum>temp) temp=sum; if(ans<flag[j-1]+temp) ans=temp+flag[j-1];//序列中的元素和分别与记录好的各段最大和相加,选出其中最大值即为所求 if(sum<0)sum=0; } printf("%d\n",ans); } return 0; }
poj 2479 Maximum sum
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。