Inserting a -1 will not save you any space or memroy. If the column is an INT whether its null, -1, or the actual value, you're using the same ammount of space on disk and memory.
I think you need to know how sparesely popoulated the change matrix will be with unchanged values. If there are lots of unchanged values, the key value pair is the way to go. IF not, you'll could eat up more space as the char(4) needed for the key column uses the equivilant space an integer, so you'll be using 2x the space for each one you change.
In your example unchanged fields are relatively rare, so the added cost of 'double space/memory' to track these as key/value would be a sum loss.
By the way, I work with tables consisting more than integers, with tens of millions of rows with overall table size in the 3-4 Gb range all the time. While making table alterations is costly, if you stick an autoincrementing key on the table or a timestamp, it should be blazingly fast to find the current data set with sort desc, limit 1 clause.
On novel approach would be to keep seprate table per column,then you wouldn't need a key for lookup. That would result in the least memory/disk footprint.
In any of these for fast lookup of the 'last' value, you'll need to put some type of timestamp or autoincrementing index field.
If you never use these columns in joins or calucalation in SQL queries directly, and your #1 concern is memory / disk footpring, one final option would be to store it all values in a single varchar column as a delimited string like '123,22,333,1'. For large numbers this uses a lot of space and wouldn't be worth it, but if you're numbers are less than 5 digits or it could out, as it's 1 byte per character (the number digits and included commas) plus one for the varchar overhead.