码迷,mamicode.com
首页 > 其他好文 > 详细

一个节省空间的小技巧

时间:2015-01-19 20:54:07      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

我们往往习惯将运算过程的临时结果存储起来,这样的思想比较容易理解也是惯性的思维,然而往往大多数情况下我们不需要存储中间过程的变量。

这里举一个例子,杭电OJ的1003题MaxSum,虽然同时采用暴力求解,但是中间的sum结果不采用二维数组存储而只是简单的通过每次置0后重新计算这样就可以节省空间。

虽然超时了,但是还是将代码粘贴下来,来警醒自己该丢弃的丢弃,不要有惯性思维。

/*1003 maxSum
解决方案:类动态规划
结果:超时
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM_LENGTH 100000 + 100

int main()
{
int num_case,num_len;
int num[NUM_LENGTH];
//int sum[NUM_LENGTH][NUM_LENGTH];
int i,j,k,maxSum,start,end,thisSum;
scanf("%d",&num_case);

for(i = 1; i <= num_case; i++)
{
scanf("%d",&num_len);
memset(num,0,sizeof(num));
//memset(num,0,sizeof(sum));
/*
for(j = 0;j < num_len; j++)
for( k = 0; k < num_len; k++)
{
sum[j][k] = 0;
}
*/

for(j = 0; j < num_len; j++)
{
scanf("%d",&num[j]);
}

/*
for(j = 0; j < num_len; j++)
{
sum[j][j] = num[j];
}
*/

//maxSum = sum[0][0];
maxSum = num[0];
start = 0;
end = 0;

for( j = 0; j < num_len - 1; j++ )
{
thisSum = 0; //通过每次重新设置求和的值来进行优化存储空间
for( k = j; k < num_len - 1; k++ )
{
thisSum += num[k]; //在此处进行优化,用临时变量存储当前求和而不是用二维数组永久存储

if(thisSum > maxSum)
{
maxSum = thisSum;
start = j + 1;
end = k + 1;
}
}
}
/*
if(sum[num_len - 1][num_len - 1] > maxSum)
{
maxSum = sum[num_len - 1][num_len - 1];
start = num_len;
end = num_len;
}
*/

printf("Case %d:\n",i);

if(i != num_case)
printf("%d %d %d\n\n",maxSum,start,end);
else
printf("%d %d %d",maxSum,start,end);

}
}

 

顺便贴一下某位大神写的AC的DP代码:

  1. #include<iostream>  
  2. using namespace std;  
  3. #define Min -999999  
  4. int main()  
  5. {  
  6.     int data[100000],start,end;  
  7.     int m;  
  8.     int step=1;  
  9.     cin>>m;      
  10.     while(m--)  
  11.     {  
  12.         int n;  
  13.         cin>>n;  
  14.         for (int i=1; i<=n;i++)  
  15.             cin>>data[i];  
  16.         int max = Min;  
  17.         int k=1;  
  18.         int sum = 0;  
  19.         for (i=1; i<=n; i++)  
  20.         {  
  21.             sum = sum + data[i];  
  22.             if (sum > max)  
  23.             {  
  24.                 max = sum;  
  25.                 start=k;  
  26.                 end=i;  
  27.             }  
  28.             if(sum<0)  
  29.             {  
  30.                 sum=0;  
  31.                 k=i+1;  
  32.             }  
  33.         }  
  34.         if(step!=1)  
  35.             cout<<endl;  
  36.         cout<<"Case "<<step<<":"<<endl;  
  37.         cout<<max<<" "<<start<<" "<<end<<endl;  
  38.         step++;  
  39.     }  
  40.     return 0;  
  41. }  

一个节省空间的小技巧

标签:

原文地址:http://www.cnblogs.com/daimadebanyungong/p/4234692.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!