标签:
我们往往习惯将运算过程的临时结果存储起来,这样的思想比较容易理解也是惯性的思维,然而往往大多数情况下我们不需要存储中间过程的变量。
这里举一个例子,杭电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代码:
标签:
原文地址:http://www.cnblogs.com/daimadebanyungong/p/4234692.html