【2008】 求数列最大累加和的子序列
来源:互联网 发布:matlab调用python脚本 编辑:程序博客网 时间:2024/06/06 06:03
Time Limit: 3 second
Memory Limit: 2 MB
一个有10个元素、元素值在[-100,100]之间的整数数列,数列的数据通过键盘输入,从中找出最大累加加的子序列。
例如10个数分别如下:10 6 25 30 -3 -29 -61 5 -61 52
所得结果为10+6+25+30=71。
如果10个数分别如下:-69 -62 50 -64 84 1 -29 13 17 -20
所得结果为84+1+-29+13+17=86
Input
输入文件有10行,每行输入一个元素
Output
输出只有一行,输出最大累加和的子序列的各元素及和
Sample Input
1062530-3-29-615-6152
Sample Output
10+6+25+30=71
【题解】
这是个动态规划动态转移方程是
if (累加和 >0) THEN F[I] = MAX(F[I-1],累加和) ELSE F[I] = MAX(F[I-1],0);
只要在扫描的时候顺便记录一下当前累加和的起点和终点就可以
【代码】
#include <cstdio>int a[11],f=1,t=1,max;void input_data(){for (int i = 1;i <= 10;i++) //输入10个数据 scanf("%d",&a[i]);max = a[1];//先让最大值等于第一个数 初始的时候f = 1,t = 1;表示从1开始到1的一个累加和 }void get_ans(){int tf = 1, tt = 1; //这个tf和tt是随时更新的序列的开头和结尾 int now = a[1]; //这时当前的累加和 for (int i = 2;i <= 10;i++){if (now + a[i] >0) //如果累加当前这个数字后累加和>0,那么就继续累加 同事尝试更新最大值。 {now += a[i];tt = i;//更新实时的尾序列 f=from t = to if (now > max) //更新最大值后要改变答案的头序列和尾序列 {f = tf;t = tt;max = now;}}else //如果累加后 <0 则 这个数不取效果是最好的 如 99 -100 加到第二项后=-1还不如直接取一个99; {tf = i+1; //直接跳到下一个数尝试找更好的累加序列。 tt = i+1;now = 0;}}}void output_ans(){for (int i = f; i <= t-1;i++)printf("%d+",a[i]);printf("%d=%d",a[t],max);}int main(){input_data();get_ans();output_ans();return 0;}
0 0
- 【2008】 求数列最大累加和的子序列
- 求最大子数列的和
- 求两个子数组最大的累加和
- 求累加和小于等于k的最大子矩阵
- 求两个子数组最大的累加和
- 求一个数列中的最大子序列
- 求最大子序列的和
- 求连续子序列的最大和
- 求数组的最大子序列和
- 求最大子序列的和
- 求数组最大子序列的和
- 求最大连续子序列的和
- 求最大连续子序列的和
- 求最大子序列的和
- 求最小子序列和 求最小的正序列 求最大子序列乘积
- 求最大子序列和
- 求最大子序列和
- 求最大子序列和
- Android动画之---补间动画
- IOS弹出提示框
- Power of Three
- Move Zeroes
- 开始新的博客生活
- 【2008】 求数列最大累加和的子序列
- mybatis注解案例
- HDU 1166 (segment tree)
- Android自带抽屉布局中NavigationView的动态生成
- Libcurl的编译_HTTP/HTTPS客户端源码示例
- Decode Ways
- tomcat启动与Server.xml文件的解析
- mybatis日志输出
- 陶哲轩实分析-第18章 Lebesgue测度