一个节省空间的小技巧
来源:互联网 发布:淘宝4星怎么贷款 编辑:程序博客网 时间:2024/05/16 07:30
我们往往习惯将运算过程的临时结果存储起来,这样的思想比较容易理解也是惯性的思维,然而往往大多数情况下我们不需要存储中间过程的变量。
这里举一个例子,杭电OJ的1003题MaxSum,虽然同时采用暴力求解,但是中间的sum结果不采用二维数组存储而只是简单的通过每次置0后重新计算这样就可以节省空间。
虽然超时了,但是还是将代码粘贴下来,来警醒自己该丢弃的丢弃,不要有惯性思维。
1 /*1003 maxSum 2 解决方案:类动态规划 3 结果:超时 4 */ 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <string.h> 8 9 #define NUM_LENGTH 100000 + 100 10 11 int main() 12 { 13 int num_case,num_len; 14 int num[NUM_LENGTH]; 15 //int sum[NUM_LENGTH][NUM_LENGTH]; 16 int i,j,k,maxSum,start,end,thisSum; 17 scanf("%d",&num_case); 18 19 for(i = 1; i <= num_case; i++) 20 { 21 scanf("%d",&num_len); 22 memset(num,0,sizeof(num)); 23 //memset(num,0,sizeof(sum)); 24 /* 25 for(j = 0;j < num_len; j++) 26 for( k = 0; k < num_len; k++) 27 { 28 sum[j][k] = 0; 29 } 30 */ 31 32 for(j = 0; j < num_len; j++) 33 { 34 scanf("%d",&num[j]); 35 } 36 37 /* 38 for(j = 0; j < num_len; j++) 39 { 40 sum[j][j] = num[j]; 41 } 42 */ 43 44 //maxSum = sum[0][0]; 45 maxSum = num[0]; 46 start = 0; 47 end = 0; 48 49 for( j = 0; j < num_len - 1; j++ ) 50 { 51 thisSum = 0; //通过每次重新设置求和的值来进行优化存储空间 52 for( k = j; k < num_len - 1; k++ ) 53 { 54 thisSum += num[k]; //在此处进行优化,用临时变量存储当前求和而不是用二维数组永久存储 55 56 if(thisSum > maxSum) 57 { 58 maxSum = thisSum; 59 start = j + 1; 60 end = k + 1; 61 } 62 } 63 } 64 /* 65 if(sum[num_len - 1][num_len - 1] > maxSum) 66 { 67 maxSum = sum[num_len - 1][num_len - 1]; 68 start = num_len; 69 end = num_len; 70 } 71 */ 72 73 printf("Case %d:\n",i); 74 75 if(i != num_case) 76 printf("%d %d %d\n\n",maxSum,start,end); 77 else 78 printf("%d %d %d",maxSum,start,end); 79 80 } 81 } 82 83 84 85 顺便贴一下某位大神写的AC的DP代码: 86 87 #include<iostream> 88 using namespace std; 89 #define Min -999999 90 int main() 91 { 92 int data[100000],start,end; 93 int m; 94 int step=1; 95 cin>>m; 96 while(m--) 97 { 98 int n; 99 cin>>n; 100 for (int i=1; i<=n;i++) 101 cin>>data[i]; 102 int max = Min; 103 int k=1; 104 int sum = 0; 105 for (i=1; i<=n; i++) 106 { 107 sum = sum + data[i]; 108 if (sum > max) 109 { 110 max = sum; 111 start=k; 112 end=i; 113 } 114 if(sum<0) 115 { 116 sum=0; 117 k=i+1; 118 } 119 } 120 if(step!=1) 121 cout<<endl; 122 cout<<"Case "<<step<<":"<<endl; 123 cout<<max<<" "<<start<<" "<<end<<endl; 124 step++; 125 } 126 return 0; 127 }
0 0
- 一个节省空间的小技巧
- BOOST源码笔记(3) - 节省内存的小技巧
- 一个对于动态分配数组空间的小技巧
- 联合:节省空间的类
- 的一个小技巧
- 节省空间
- 求空间节省比例的方法
- C/C++语言里面的空间节省
- union:一种节省空间的类
- union: 一种节省空间的类
- 节省空间的结构:BitMap(位图)
- VS2015使用小技巧 如何知道一个类的命名空间
- 小技巧:打印log时, 多了一个感叹号, 至少节省了1-2个小时!------又来说strings
- 一个.net的小技巧
- JbossIDE的一个小技巧
- printf的一个小技巧
- WinRAR的一个小技巧
- AutoCAD的一个小技巧
- iOS开发必读-GitHub 上Top100 的 Objective-C 项目
- 添物不花钱学JavaEE(基础篇) --HTML
- CodeIgniter框架源码笔记(3)——每次请求的总调度师傅:引导文件CodeIgniter.php
- Codeforces Round #361 (Div. 2)B. Mike and Shortcuts【BFS】
- Layer2-10 Ether-channel以太网捆绑
- 一个节省空间的小技巧
- ntohs的一个简单实现(将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形)
- opencv contours的问题
- C#中的@符号用法
- 【leetcode】27. Remove Element
- 属性动画
- 介绍一个二次排序的小技巧(best coder27期1001jump jump jump)
- Git命令实战总结
- 杭电OJ BestCoder28期1001Missing number问题(小技巧偏移法)