博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1003 Max Sum
阅读量:5313 次
发布时间:2019-06-14

本文共 1550 字,大约阅读时间需要 5 分钟。

题目大意:给出一段数组,然后让你求出最大的子串和,并记录这个最大的子串和的开始位置和结束的位置。

解题报告:动态规划题,用最大子串和。即假设现在要求的是数组a[]的最大子串和,先定义一个f[]数组,首先将f[]数组初始化,判断a[1]是否大于0,若大于等于0,

则f[1]=a[1],若a[1]<=0,则f[1]=0,接下来用递归了,递归方程为f[i]=(f[i-1]+a[i])>0? f[i-1]+a[i]:0,递归完了之后再求出f[]数组里面的最大值,就是要求的最大子串和。然后就是求最大子串和的位置的问题,这个只要当判断到了a[i]小于0的时候就把当前的串的位置记录在另一个结构体里面,也可以直接把f[]数组和直接定义成结构体。

View Code
1  #include
2 #include
3 using namespace std; 4 int T,a[1000010]; 5 struct fun { 6 int date; 7 int front,rear; 8 }f[1000010]; 9 int ma(int x,int y) {10 return (x>y? x:y);11 }12 int main() {13 scanf("%d",&T);14 for(int l=1;l<=T;++l) {15 int n;16 scanf("%d",&n);17 for(int i=1;i<=n;++i)18 scanf("%d",&a[i]);19 int k=0;20 for(int i=1;i<=n;++i)21 if(a[i]>0)22 k=1;23 int max=1;24 if(k){25 for(int i=0;i
f[max].date) {39 max=i;40 f[max].rear=max;41 }42 }43 else if(k==0) {44 int min=1;45 for(int i=2;i<=n;++i)46 if(a[i]>a[min])47 min=i;48 max=min;49 f[max].date=a[min];50 f[max].front=min;51 f[max].rear=min;52 }53 printf("Case %d:\n%d %d %d\n",l,f[max].date,f[max].front,f[max].rear);54 if(l!=T)55 printf("\n");56 }57 return 0;58 }

 

转载于:https://www.cnblogs.com/xiaxiaosheng/archive/2013/05/02/3055228.html

你可能感兴趣的文章
让你的 Python 代码优雅又地道
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
jmeter里面Dug Sampler 和json提取器的用法
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
公司居然使用监听设备,大家来讨论下IT公司应该怎样管理
查看>>
一句简单的SQL----模糊 查询
查看>>
编程十年 (13):毁人不倦1
查看>>
排序算法小结
查看>>
Android Core
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
【遇见时光】笔试-偶数最大距离-java
查看>>
【AC自动机】bzoj4327: JSOI2012 玄武密码
查看>>
jquery 判定checkbox是否选中
查看>>
FOJ Problem 2257 Saya的小熊饼干
查看>>
js分享2
查看>>
Java 实践:生产者与消费者
查看>>
笛卡尔积和卡氏积
查看>>