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
- hdoj1003 Max Sum (DP 最大子序列求和)
- HDU 1003 Max Sum(dp,最大连续子序列和)
- HDU 1003 Max Sum(dp,最大连续子序列和)
- HDU-#1003 Max Sum(DP+区间最大子序列)
- hdu 1003 Max Sum(分而治之||最大连续子序列 dp)
- 【最大连续子序列和dp】hdu 1003 Max Sum
- hdu1003 Max Sum(DP之最大子序列和)
- hdoj1003-Max Sum(数组的最大和)
- Max Sum(最大连续子序列)
- Max Sum hdu+最大子序列和
- hdu1003 Max Sum 最大连续子序列
- Max sum 最大子序列和
- HDU max sum(最大子序列之和)
- Max Sum(最大连续子序列)
- Max Sum 最大连续子序列和
- Max Sum + 最大连续子序列
- HDOJ1003 Max Sum
- HDOJ1003:Max Sum
- Android 沉浸式状态栏
- Android Sqlite数据库常见问题总结
- Makefile %
- Netty笔记
- TensorFlow学习笔记(1)--Mac安装TensorFlow
- hdoj1003 Max Sum (DP 最大子序列求和)
- hashmap和hashtable的区别
- python库的安装
- Sublime Text 3 配置以及使用
- Thinkphp3.2.3 关联模型 一对多 数据写入和更新详解
- LinkedList基本用法
- Problem C: 类的初体验(III)
- C语言实现一个简单的栈
- java中方法drawImage()