关于求最大子矩阵和的问题

jinTester 2014-06-30 12:56:52
我是用矩阵压缩和求连续和最大子串求的,复杂度为O(n^3),看到别人的代码也是这样的,但为什么我的超时他的只要36ms,求大神看一下哪里导致时间差异这么大,第一份是我的
#include <iostream>
#include <cstdio>
using namespace std;
int num[105][105]={0};
int main()
{
int n,t,ans,r,i,j,k;
while(scanf("%d",&n)){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&t);
num[i][j]=num[i-1][j]+t;
}
ans=num[1][1];
for(i=0;i<n;i++){
for(j=i+1;j<=n;j++){
r=num[j][1]-num[i][1];
for(k=2;k<=n;k++){
if(r<0) r=num[j][k]-num[i][k];
else r+=num[j][k]-num[i][k];
if(ans<r) ans=r;
}
}
}
printf("%d\n",ans);
}
return 0;
}

这份是36ms的
#include<iostream>
const int MAX=101;
int matrix[MAX][MAX];
int DP[MAX][MAX];
using namespace std;
int main()
{
int n,i,j,Max,maxn,sum;
while(cin>>n)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>matrix[i][j];
}
}
memset(DP,0,sizeof(DP));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
DP[j][i]=DP[j][i-1]+matrix[i][j];
}
}
Max=0;
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
maxn=0;
sum=0;
for(int k=1;k<=n;k++)
{
sum+=DP[k][j]-DP[k][i-1];
if(sum>0)
{
if(sum>maxn)
maxn=sum;
}
else
sum=0;
}
if(maxn>Max)
Max=maxn;
}
}
cout<<Max<<endl;
}
return 0;
}
...全文
263 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinTester 2014-06-30
  • 打赏
  • 举报
回复
果然是cin和scanf的原因,但是在刘汝佳的书上看到说在输入大数的时候scanf比cin会快啊,郁闷,难道输入的数比较小的时候cin又比scanf快了!真难。谢谢大家了,这两个代码一个是我自己得到,一个是发在讨论区的,应该都是Release的!
赵4老师 2014-06-30
  • 打赏
  • 举报
回复
都是Release版的?
xuzhouweihao 2014-06-30
  • 打赏
  • 举报
回复
hi jin 看了下函数,复杂度确实没有太大的差异,但是一个超时,一个只用了36ms, 对比了其他的处理。一个使用scanf printf,一个使用cin cout。 大胆的猜测了下: scanf printf是库函数,而cin cout只是一个stream类对象。 是不是时间消耗都是在调用函数时出现的。
baichi4141 2014-06-30
  • 打赏
  • 举报
回复
scanf在读到文件末尾或者读取错误的时候返回-1 while()判断是否结束循环的标准是表达式值为0 没细看代码,我猜是这个原因

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧