切换到宽版
  • 14323阅读
  • 10回复

什么是滚动数组 [复制链接]

上一主题 下一主题
离线william
 
只看楼主 倒序阅读 0 发表于: 2007-09-24
听大牛们常常讲起,能否详细介绍一下?
离线orangeclk
只看该作者 1 发表于: 2007-09-24
同问。
RP降至零点,NOIP2007完美彻底挂掉。。。
离线tzwangzy
只看该作者 2 发表于: 2007-10-03
I don't know
离线tzwangzy
只看该作者 3 发表于: 2007-10-03
就是滚过来滚滚去的数组
离线tzwangzy
只看该作者 4 发表于: 2007-10-03
大牛们说的
离线huwentao
只看该作者 5 发表于: 2007-10-03
顶一下
看看有高手来解答没
离线liuichou
只看该作者 6 发表于: 2007-10-03
例如01背包问题,开[1..10000,1..10000]肯定mle
怎么办呢?
由于动态规划只需要用前n个数值,那么[1..10000,0..n]就够了
  1. 具体实现如下
  2. 假设是01背包问题,需要用前1个数组的值,那么就[1..10000,0..1]
  3. 开一个变量(例如c)
  4. 每次循环就
  5. for i:=1 to 10000 do begin
  6. c:=1-c
  7. f[i,c]:=max{f[i,1-c],f[i-w[i],,1-c}
  8. 从而实现节约空间
  9. c为最后的状态


附01背包问题滚动数组解:
  1. 光光的作业(homework)
  2. [问题描述]
  3. 光光上了高中,科目增多了。在长假里,光光的老师们都非常严厉,都给他布置了一定量的作业。假期里,光光一共有的时间是k 小时。在长假前,老师们一共给光光布置了n 份作业,第i 份作业需要的时间是ti 小时。但是由于老师们互相不商量,因此光光有可能不能完成老师的作业。当可能不能完成老师的作业时,光光就事后去向老师说明,然后被老师批评一顿了事。
  4. 对于一件作业,只有2 种情况:完成或者不完成(快要完成也算不完成)。如果没完成,受到批评是天经地义的。但是,不同的作业对于光光来说,批评的力度是不同的。第i 件作业如果没完成,就要受到pi 个单位的批评。
  5. 多次这样之后,光光想要在长假前就知道他至少会受到多少个单位的批评。你能帮助他吗?
  6. [输入]
  7. 输入文件homework.in 包含以下内容:第一行只有一个数字k。第二行只有一个数字n。接下来n 行,每行两个数字,分别是ti 和pi, 两个数字之间用一个空格分开。
  8. 100%的数据中,k<=100000,ti<=10000,pi<=10000;
  9. 30%的数据中,n<=20;
  10. 100%的数据中,n<=500。
  11. [输出]
  12. 输出文件homework.out 仅包含一行,是一个数字,代表了光光最少受到的批评。
  13. [样例]
  14. homework.in
  15. 5
  16. 3
  17. 2 6
  18. 1 3
  19. 4 7
  20. homework.out
  21. 6

  1. var
  2.   f:array [0..1,0..100000] of longint;
  3.   t,p:array [1..500] of integer;
  4.   k,n,i,j,c,c2,pall:longint;
  5. begin
  6.   //assign(input,'homework.in'); reset(input);
  7.   //assign(output,'homework.out'); rewrte(output);
  8.   readln(k);
  9.   readln(n);
  10.   pall:=0;
  11.   fillchar(f,sizeof(f),0);
  12.   for i:=1 to n do begin
  13.     readln(t[i],p[i]);
  14.     pall:=pall+p[i];
  15.     for j:=t[i] to k do
  16.       if f[0,j]<p[i] then f[0,j]:=p[i];
  17.   end;
  18.   c:=0;
  19.   for i:=1 to n do begin
  20.     c:=1-c;
  21.     for j:=1 to k do begin
  22.       f[c,j]:=f[c,j-1];
  23.       if j-t[i]>0 then
  24.         if f[1-c,j-t[i]]+p[i]>f[c,j] then f[c,j]:=f[1-c,j-t[i]]+p[i];
  25.     end;
  26.   end;
  27.   writeln(pall-f[c,k]);
  28.   //close(input); close(output);
  29. end.

楼下的建议已经改了
[ 此贴被liuichou在2007-10-04 12:13重新编辑 ]
离线orangeclk
只看该作者 7 发表于: 2007-10-04
直接c:=1-c不就行了,没必要用mod。
RP降至零点,NOIP2007完美彻底挂掉。。。
离线appotoxin
只看该作者 8 发表于: 2007-10-04
就是动态规划时反复利用已开辟的空间,丢弃大量无用数组的方法
作用是大规模动规时省内存
离线aspend
只看该作者 9 发表于: 2007-10-05
0 1背包问题只要用一个数组就可以了
快速回复
限100 字节
 
上一个 下一个