Ruby; not very optimal by memory usage, but clear enough
Algorithm:
class Array
def accum
inject([]) {|r, v| r << yield(r.last, v) }
end
end
def min_flips_mono_incr(s)
ones = s.chars.accum {|l, v| [l, v.ord - '0'.ord].compact.sum }
zeros = s.chars.reverse.accum {|l, v| [l, '1'.ord - v.ord].compact.sum }.reverse
ones.zip(zeros).collect(&:sum).min - 1
end