Declaring arrays with parametrized does not generate any problem.
However from what I know you cannot use a parametrized size for a value assignment.
You can instead leave the 'size' field empty.
It would look like:
reg [0:8*max_neigh-1]neighbors = 'h010203040304050607;
If you absolutely want to use your size parameter you can do something like:
reg [0:8*max_neigh-1]neighbors = {size{1'b0}};
Which would duplicate the 1'b0 value size in the array, which would be equivalent to 72'h000000000000000000.
BONUS
Be aware that such assignment cannot be synthesised.
This is worse than that in fact, the synthesis tool would not report an error, maybe a warning, but simply ignore that assignment.
To initialize a register you should use a process.
For example a synchronous process would be with clk a clock input and nrst a reset signal that is active on low-level:
reg [0:8*max_neigh-1]neighbors;
wire [0:8*max_neigh-1]next_neighbors_value;
always@(posedge clk or negedge nrst)
if(~nrst)
neighbors <= {72{1'b0}};
else
neighbors <= next_neighbors_value;
And btw, 8*8 = 64 and not 72.