hdu 1003-Max Sum
来源:互联网 发布:视觉对位算法角度 编辑:程序博客网 时间:2024/05/14 18:10
纠结的一道题,题目本身并不怎么难,不过正赶上这两天倒霉,折腾来折腾去的,现在才做出来
题目大意是说给出一列整数,需要求出这列整数最大的并且要求连续的子序列,并要说明该子序列的起点与终点,若有多种答案的话则以第一个为准;
一开始打算用打表,结果超时了,后来百度了下,大概整理下思路:
初始化max为INF,sum为0用以临时保存子序列的和;
依次读取数据v,
判断sum+=v是不是比max大
如果是的话,将max替换,并标记结束点ed为i(代表当前是第i个数);
如果sum+=v之后变得小于零了,就说明它不应该再继续作为子序列的一部分,因为要求子序列尽量大,既然它已经为负数,那以后也只会拖累其他的数变小,所以此时将sun重置为0,并且标记s为i的下一位i+1,
(但要注意s并不一定代表最终输出起始点,因为有可能接下来的序列虽然也不为负数,但仍不能超过之前的某一子序列;所以对起始点bg的赋值也应该放在当sum+=v大于max这一情况成立时,而它的值正应该是刚说到的s。
综上所述,得出状态转移f(i)=max{f(i-1)+v,v},(好吧,其实这个公式我觉得比较纠结,看来看去反而误导人,不过也有可能是我个人问题,随便啦~~
最后备份代码:
#include<cstdio>int main(){int n(0),num,ne,g,bg,ed,s;scanf("%d",&num);while(++n<=num){scanf("%d",&ne);int sum=0,max=-99999999;bg=ed=s=1;for(int i=1;i<=ne;++i){scanf("%d",&g);sum+=g;if(sum>max){max=sum;bg=s;ed=i;}if(sum<0){sum=0;s=i+1;}}printf("Case %d:\n",n);printf("%d %d %d\n",max,bg,ed);if(n!=num) printf("\n");}return 0;}
- HDU 1003 Max Sum
- hdu 1003 Max Sum
- hdu 1003 Max Sum
- HDU-1003 max sum
- HDU 1003 - Max Sum
- HDU 1003 Max Sum
- hdu 1003 Max Sum
- HDU 1003 Max Sum
- HDU 1003 Max Sum
- hdu 1003 max sum
- HDU 1003 Max Sum
- hdu 1003 Max Sum
- HDU 1003 Max Sum
- hdu 1003 Max Sum
- HDU 1003 Max Sum
- Hdu 1003 - Max Sum
- HDU-1003-Max Sum
- hdu - 1003 - Max Sum
- iOS 7用户界面过渡指南
- pl/sql中的length,substr和lengthb,substrb用法解析
- 单链表倒置,给你一个头指针,用递归与非递归的方法分别实现;
- jdbc 连接mySql 数据库
- android应用里面在某个界面禁止系统截屏功能的实现
- hdu 1003-Max Sum
- 得用java agent instrument动态修改或替换相关
- dedecms爆后台文件技巧
- 程序员与英语
- 生产者-消费者问题
- 振动Vibrator
- qtextend4.4.3 在nuc900平台下编译问题及解决办法
- jQuery 异步上传插件 Uploadify 使用 (Java平台)
- JNI java.lang.UnsatisfiedLinkError 的一些常见错误