hdoj1003 Max Sum (DP 最大子序列求和)

来源:互联网 发布:软件外包合同范本样本 编辑:程序博客网 时间:2024/05/29 13:50

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1003

题意:

        做T次测试,每次测试输入N个数据a1,a2,a3...an。要求出这个数字序列中和最大的连续子序列,输出最大和以及子序列的起始位置。

思路一:

        动态规划问题,sum=sum<0?num:sum+num;sum初始值为0,将最大和子序列结果看作两部分,已经输入的部分为A,即将输入的部分为B,那么max_sum=A+B;无论B的和值是多少,可以断定的是A>=0;所以条件表达式的sum为前状态,对num做了取舍后的sum为后状态,如果前状态sum<0,那么后状态sum=sum;否则sum+=num;然后继续寻找下一个状态,时间复杂度O(n)。


思路二:

        sum[i+1]=sum[i]+num[i+1];将前i项的和保存在sum[i]中,然后用两层for循环列出所有子序列的和值:

for(i=0;i<n;i++){   for(j=i+1;j<n;j++)sub_sum=sum[j]-sum[i]   },第一个for循环层为空值时要单独考虑,即可找出max_sum;时间复杂度O(n^2)。


思路一代码:

#include <stdio.h>int main(){int t,n,cas,sum,num,i;int max_ans,left_ans,right_ans,left_tmp;scanf("%d",&t);for(cas=1;cas<=t;cas++){sum=0;left_tmp=1;max_ans=-100000;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&num);if(sum<0){sum=num;left_tmp=i;}else {sum+=num;}if(sum>max_ans){max_ans=sum;left_ans=left_tmp;right_ans=i;}}printf("Case %d:\n",cas);printf("%d %d %d\n",max_ans,left_ans,right_ans);if(cas!=t)printf("\n");}return 0;}



0 0
原创粉丝点击