求高手详细讲解http://acm.hdu.edu.cn/showproblem.php?pid=1003

我的代码:#include<iostream>
using namespace std;
int f,l;
int Max(int a[],int n)
{
int i,j,t=-99999999,sum[100000];
sum[1]=a[1];
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
sum[j]=sum[j-1]+a[j];
if(t<sum[j])
{
t=sum[j];
f=i;
l=j;
}
}
}
return t;
}
int main()
{
int a[100000],t,n,m=1,i,M_sum;
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
M_sum=Max(a,n);
cout<<"case "<<m<<":"<<endl;
m++;
cout<<M_sum<<" "<<f<<" "<<l<<endl<<endl;
f=0;
l=0;
}
system("pause");
return 0;
}
我发现很多不良之处,但是不知道怎么改良。超时问题亟待解决!
听说用动态规划不会超时,麻烦各位大大帮帮忙,烦劳详细的用动态规划跟我讲解一下。。。。

根据题目特点,起点在负数后的第一个整数或a[0],终点在某一负数前。思路如下:
先找出所有的负数,然后把整个数组进行分段,a[0]到第一个负数为第一段,以后每一段都是以负数开头正数结尾,对各段分别求和,这样问题就转换为少数的几段间的最大值和起始点问题.
例如:
7 0 6 -1 1 -6 7 -5
分为三段7 0 6 -1 为第一段n1,1 -6 为第二段n2,7 -5为第三段n3。
然后把n1,n2,n3用同样的方式分段,如此迭代,从而大大简化了数据量。最后用排列组合的方式求出最大的Sum,起始点为段的起始点。代码有时间另附。追问

非常感谢。麻烦你把代码也发来吧。

追答

#include
#include
#include
int SqrSort(int *p,int c,int *n);

int main()
{
int n=1,m=0,i,j,s[20][3]={0},*p=NULL;
scanf("%d",&n);
for(j=0;jv)
m=i,v=n[0];
n[1]++;
if(n[0]>v)
n[2]=i;
else
n[0]=v,n[2]=m;
return 0;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-09
#include<iostream>
using namespace std;
int f,l;
int Max(int a[],int n)
{
int maxelement = -1001, maxindex, tempmax, i, tempf, t;
tempmax = 0, tempf = 1;
t = -1001;
for(i=1;i<=n;i++)
{
if(maxelement < a[i])
{
maxelement = a[i];
maxindex = i;
}
if(tempmax+a[i]<0)
{
tempmax = 0;
tempf = i+1;
}
else
{
tempmax = tempmax+a[i];
}
if(tempmax > t)
{
t = tempmax;
f = tempf;
l = i;
}
}
if(maxelement <= 0)
{
t = maxelement;
f = l = maxindex;
}
return t;
}
int main()
{
int a[100000],t,n,m=1,i,M_sum;
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
M_sum=Max(a,n);
if(m>1) cout << endl;
cout<<"Case "<<m<<":"<<endl;
m++;
cout<<M_sum<<" "<<f<<" "<<l<<endl;
f=0;
l=0;
}
system("pause");
return 0;
}

求高手详细讲解http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=1003
7 0 6 -1 1 -6 7 -5 分为三段7 0 6 -1 为第一段n1,1 -6 为第二段n2,7 -5为第三段n3。然后把n1,n2,n3用同样的方式分段,如此迭代,从而大大简化了数据量。最后用排列组合的方式求出最大的Sum,起始点为段的起始点。代码有时间另附。

高手帮忙解决一下!是acm.tzc.edu.cn上的1004题
http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=1052 我已经帮你把TZC的那题AC了 下面是代码 include<stdio.h> include<string.h> include<stdlib.h> int cmp(const void *a,const void*b){ return *(int*)b-*(int*)a;} int n;void inti(int a[]){ int i;for(i=0;i<n;i++)sc...

对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串...
}} 怎么在 http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2025上提交通不过呢?我想知道错在哪= = 展开  我来答 分享 微信扫一扫 网络繁忙请稍后重试 新浪微博 QQ空间 举报 浏览1 次 可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。 字符串 字母 max 搜索资料 本...

http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2184 acm
include <stdio.h> include <stdlib.h> void hanoi(int a[],int b[],int c[],int n,double *m)\/*数组a[],b[],c[]分别代表三根柱子,第0个元素存放本柱子上的盘子数目,其余元素存放盘子编号,例如a[0]存放的是第一根柱子上的盘子数目。n是总盘子数目,m指针所指向的单元存放需要走的...

杭电acm1157 http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=1157
你这程序自己都没测过吧?样例都过不了。1、题目中N (1 <= N < 10,000),你的数组长度才1000。2、数组的下标是从0开始,那么((N+1)\/2)是中位数的后一个数的下标。3、排序的时候你用a.length,这是一个固定值,而不是N,你这里是1000,这样就把数组中后面没用的值也参与进来排序了。

杭电acm1089题 求高手用C讲解 http:\/\/acm.hdu.edu.cn\/showproblem.php...
所以 while( scanf("%d%d",&a,&b)==2) 就是判断是不是成功读取了2个数字 当scanf()遇到End-of-File的时候会特殊的返回-1,也就是EOF 所以 while(scanf("%d%d",&a,&b)!=EOF) 就是判断是不是还没有读到EOF 在这个题目里面,两种判断都是成立的 至于你提出的 while(scanf("%d%d",&...

二分查找 和 时间复杂度
9.跳石头 luogu.org\/problem\/P2678 10聪明的质监员 luogu.org\/problem\/P1314 11.分梨子 luogu.org\/problem\/P1493 12.第k大 acm.hdu.edu.cn\/showprob...做出来的童鞋可以把题解发在评论区,让我和大家一起学习学习【哭哭】。三.时间复杂度 时间复杂度是初学者必备的一个知识点,既可以理解为...

人见人爱A^B http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2035
for(int i=0;i<m-1;i++){ n*=p;if(n>=1000)n=n%1000;} 先做n*n%1000,结果再乘上n,再%1000,这样做m次即可 这道题这样做完全能过,O(m)的复杂度 至于你那个代码他将这个过程二分优化过,a^b%10000,将a不断乘以自己的过程用快速幂乘法来做,这里怎么做快速幂乘你自己查吧,...

求教 二叉树
然后把每个要插入的树按照规则放到树里面:从根开始,比当前节点大的就往左儿子走,比当前节点小的就往右儿子走。走到某个空位时就可以插入到这里。最后用先序或者后序遍历输出这棵树,那么这些就排序好了。二叉树真的是博大精深的说,只是稍微说说这点而已。加油,慢慢来QQ:328880142 ...

杭电2043哪里错了?http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2043
include<string.h> main(){ int a,b,c,d,i,j,k,e,q,w;char s[51];scanf("%d",&a);while(a){ b=0;c=0;d=0;k=0;e=0;a--;scanf("%s",s); \/\/ 用scanf比较安全, gets难处理.if(strlen(s)>16||strlen(s)<8) \/\/ 你忘了检测长度 { printf("NO\\n");continue;} fo...

相似回答
大家正在搜