我为0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
问题编写了此代码。但它回答了错误的答案。例如,对于此实例,返回0,而正确答案为15.用户首先给出数组大小,然后输入元素。我的错是什么?
int kadane(int* arr, int* start, int* finish, int n)
{
int sum = 0, maxSum = INT_MIN, i;
*finish = -1;
int local_start = 0;
for (i = 0; i < n; ++i)
{
sum += arr[i];
if (sum < 0)
{
sum = 0;
local_start = i+1;
}
else if (sum > maxSum)
{
maxSum = sum;
*start = local_start;
*finish = i;
}
}
if (*finish != -1)
return maxSum;
maxSum = arr[0];
*start = *finish = 0;
for (i = 1; i < n; i++)
{
if (arr[i] > maxSum)
{
maxSum = arr[i];
*start = *finish = i;
}
}
return maxSum;
}
void findMaxSum(int** M,int n)
{
int maxSum = INT_MIN, finalLeft, finalRight, finalTop, finalBottom;
int left, right, i;
int* temp=new int[n];
int sum, start, finish;
for (left = 0; left <n; ++left)
{
memset(temp, 0, sizeof(temp));
for (right = left; right < n; ++right)
{
for (i = 0; i < n; ++i)
temp[i] += M[i][right];
sum = kadane(temp, &start, &finish, n);
if (sum > maxSum)
{
maxSum = sum;
finalLeft = left;
finalRight = right;
finalTop = start;
finalBottom = finish;
}
}
}
printf("(Top, Left) (%d, %d)\n", finalTop, finalLeft);
printf("(Bottom, Right) (%d, %d)\n", finalBottom, finalRight);
printf("Max sum is: %d\n", maxSum);
}
int _tmain(int argc, _TCHAR* argv[])
{
int N;
cout<<"enter size of 2d array"<<endl;
cin>>N;
int** M;
M=new int*[N];
for(int i=0;i<N;i++)
{
M[i]=new int [N];
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cin>>M[i][j];
}
}
findMaxSum(M,N);
/*for(int i=0;i<N;i++)
{
delete []M[i];
M[i]=0;
}
delete []M;*/
return 0;
}
dt <- data.table(v1=c(1,2,3) , v2=c("axb","cxxd","exfxgx"))
dt[ , v3:=gsub("x",v1,v2)]
答案 0 :(得分:3)
memset(temp, 0, sizeof(temp));
由于sizef(temp)
的计算结果只是指针的大小,因此没有按预期执行。
将该行替换为:
memset(temp, 0, sizeof(int)*n);
通过这种改变,我的测试中的工作正常。
您也可以使用:
memset(temp, 0, sizeof(*temp)*n);