A method of programming a three-dimensional non-volatile memory including bit lines, word lines and a three dimensional array of memory cell transistors comprising a plurality of memory cell transistor strings, each memory cell string including a vertical stack of memory cell transistors connected to a respective bit line, and gates of memory cell transistors of different memory cell transistor strings connected to a respective word line, the method comprising:
- (a) determining a tendency of a threshold voltage of a first memory cell transistor of the plurality of memory cell transistors to shift from a programmed state;
- (b) in response to the determining, selecting a first verification voltage from at least a set of verification voltages including the first verification voltage, a second verification voltage and a third verification voltage;
- and
- (c) programming the first memory cell transistor to alter the threshold voltage of the first memory cell transistor to a first range to store at least a bit of first data, the programming including verifying the threshold voltage of first memory cell transistor has been altered sufficiently using the first verification voltage, and programming a second memory cell to alter a threshold voltage of the second memory cell to the first range to store the at least a bit of the first data, including verifying the threshold voltage of the second memory cell has been altered sufficiently using one of the second verification voltage and third verification voltage.