传送门
我们设f[i][j]表示前i个数,第i个数排名是j的方案总数。
我们可以强制第1个数是山峰。然后我们可以将整个序列高度取反,得到其他的方案数。
然后我们发现这样做的时间复杂度是O(N^3)的
加上前缀和优化就是O(N^2)了
var
f:array [0..1,0..5005] of longint;
n,i,j,x,p:longint;
begin
read(n,p);
if (n=1) then begin write(1); exit; end;
x:=0; f[0,2]:=1;
for i:=3 to n+1 do begin
x:=1-x;
for j:=1 to i do f[x,j]:=(f[x,j-1]+f[1-x,i-j+1]) mod p;
end;
write(f[x,n]*2 mod p);
end.
本文介绍了一种使用动态规划解决特定计数问题的方法,通过定义状态f[i][j]来表示前i个数中第i个数排名为j的方案总数,并详细展示了如何通过代码实现这一算法。
539

被折叠的 条评论
为什么被折叠?



