Are you only holding binary digits in your array? If so, do you know you are wasting 16 times more ram memory than you need to? Have a look at the bitRead() and bitWrite() functions.
It might be worth mentioning that if you look at the two dimensional array as a table and want to replace one of the rows you can point to the row then write the new values in. Same result but another way of thinking about it.
int row = 1; // index of row to replace
int *cellRow = cells[row]; // point to row
int newRow[] = {1, 1, 0, 0}; // new values
// write new values
for (c = 0; c < 4; c++) cellRow[c] = newRow[c];