pascal高手来。这题的递推式是什么?

2025-12-18 01:33:42
推荐回答(2个)
回答1:

楼上的绝对错误,样例都过不掉。现在给出正解:

       这道题目看起来很难,但是想到了还是很简单的,我们从最简单的入手尝试找到规律。

首先,如果n等于1,那么显然只有一种情况了。

那么n等于2呢?显然有两种情况。

n等于3呢?显然有4种情况。

知道了这些有什么用呢?我们需要更一般的情况。

当n=k时(为了方便起见,k>10),有几种情况呢?

首先如果最左边是竖的一块砖,显然有f[n-1]种情况。

那么如果最左边是横的两块砖,又有f[n-2]种情况。

还有什么呢?那就是L形状的砖块在最左边。

如f1所示,最左边如果占用三块,显然有f[n-3]*2种情况。

如f2所示,如果最左边占用奇数块,显然有f[n-i]*2种情况。(i为占用的块数)

如f3所示,如果最左边占用偶数块,显然也有f[n-i]*2种情况。(i为占用的块数)

综上所述,f[n]=f[n-1]+f[n-2]+f[n-i]*2(3<=i<=n),f[0]=1;

但是这样设计出来的程序是O(N^2)的,要用前缀和优化到O(N)

程序如下:

var

  f:array[-5..10000000] of longint;

  n,m,i,sum:longint;

begin

  readln(n,m);

  f[0]:=1;

  for i:=1 to n do

    begin

      if i>2 then sum:=(sum+f[i-3]*2) mod m;

      f[i]:=(f[i-1]+f[i-2]+sum) mod m;

    end;

  writeln(f[n]);

end.

空间可以优化到O(1),这里就不再给出了。



应该没有错误,样例秒过。不懂再追问,附:图形是手画的不太标准不要介意。

赞同给采纳吧!打了这么多!

回答2:

是a[x]:=a[x-1]+a[x-2]+a[x-3]+a[x-4]

x-1,x-2不解释,x-3是两个结合,x-4是L型的2个加一个小的
没高精度的:
var
a1,a2,a3,a4,a5,a6,max,a:longint;
begin
readln(a1,a2);
case a1 of
1:write(1 mod a2);
2:write(2 mod a2);
3:write(4 mod a2);
4:write(8 mod a2);
else begin
a3:=1;
a4:=2;
a5:=4;
a6:=8;
for a:=5 to a1 do
begin
max:=(a3+a4+a5+a6) mod a2;
a3:=a4;
a4:=a5;
a5:=a6;
a6:=max;
end;
write(max);
end; end; end.
可能多了一个end 自己去吧