hdu1231 最大字段和
来源:互联网 发布:网络教老外学中文兼职 编辑:程序博客网 时间:2024/06/10 01:02
这道题目曾经困扰我很久,觉得自己的程序应该没什么问题却老是WA,测试用例全部能通过,今天重新写了一遍 另外对全负数的情况进行了专门的处理 一次就AC了 开始有点困惑,现在一看前面的逻辑还真有点荒唐
AC代码:
#include<iostream>
using namespace std;
int num[10000];
int spacial(int n)
{
int tag=1;
for(int i=0;i<n;i++)
if(num[i]>=0)
{
tag=0;
break;
}
return tag;
}
void find_max(int &low,int &high,int &max,int n)
{
int from,sum;
from=sum=0;
for(int i=0;i<n;i++)
{
if(num[i]+sum>max){max=sum+=num[i],low=from,high=i;}
else if(num[i]+sum>0){sum+=num[i];}
else {sum=0;from=i+1;}
}
}
int main()
{
int n;
while(cin>>n&&n)
{
for(int i=0;i<n;i++)cin>>num[i];
if(spacial(n))cout<<0<<" "<<num[0]<<" "<<num[n-1]<<endl;
else
{
int low,high,max;
low=high=0;max=-1;
find_max(low,high,max,n);
cout<<max<<" "<<num[low]<<" "<<num[high]<<endl;
}
}
return 0;
}
经典dp题目,思路还是蛮自然的, 这种状态转换不需要特别的知识直观很容易想到,看看以前的错误版本还是没有很好地处理全负数的情况,此时返回的maxnum肯定是负数,也只有全负数的情况返回一个负数,直接分类处理输出就ok了
不过干脆 单独处理这种情况更清晰
下面贴出一个错误版本
#include <iostream>
using namespace std;
int number[10000];
int main()
{
int n,num;
while (cin>>n&&n)
{
int sum=0,MaxSum=-100000000,start,end,from,to;
for (int i=1;i<=n;i++)
{
cin>>num;
number[i]=num;
}
from=number[1];
for (int j=1;j<=n;j++)
{
sum+=number[j];
to=number[j];
if (sum>MaxSum)
{
MaxSum=sum;
start=from;
end=to;
}
if (sum<=0)
{
sum=0;
if (j<n)from=number[j+1];
}
// if (MaxSum<0)//元素全负
// {
// }
}
cout<<MaxSum<<" "<<start<<" "<<end<<endl;
}
}
- hdu1231 最大字段和
- hdu1231 最大连续字段和(DP)
- HDU1231(求最大子序列和)
- HDU1231 最大连续子序列和
- HDU1231最大的连续序列和
- 最大子序列和问题 hdu1231
- HDU1231 最大连续子序列【最大子段和+DP】
- hdu 1003 hdu1231 简单dp最大子串和
- hdu1231 连续子数组最大和(分治,动态规划)
- HDU1003Max Sum和HDU1231最大连续子序列
- hdu1231 最大子序列
- hdu1231最大子序列
- hdu1231最大子序列
- HDU1231--最大连续子序列
- hdu1231(最大连续子序列)
- hdu1231 最大连续子序列
- hdu1231-最大连续子序列
- hdu1231最大连续子序列
- 获取主机名和IP地址
- 我叫庄展航
- 重拾javascript
- gprof性能测试工具使用分析
- 开技术博客了,欢迎大家来踩踩
- hdu1231 最大字段和
- 有点烦,讨厌平台外挂
- 程序员的茶杯
- 网卡物理地址
- Picasa相册无法访问的解决方法
- spring 基本Bean装配
- 总结ERROR 2002 (HY000):Can't connect to...之错误
- 对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成
- 庐州月