1. A method for programming memory cells, the method comprising: generating an encoded stream using a data stream, wherein the encoded stream comprises at least three different program states; wherein generating an encoded stream further comprises generating a pre-coded data stream from the data stream by logically combining a bit of the data stream with a preceding bit of the pre-coded data stream; and using the encoded stream to program the memory cells.