题目: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; }