Dynamic Programming--Picture compress


p = [0, 10, 12, 15, 255, 1, 2]


def store_bit_number(n):
    k = 1
    n = n//2
    while n != 0:
        k = k+1
        n = n//2
    return k

s = [0, 0, 0, 0, 0, 0, 0, 0, 0]
pos = [0, 0, 0, 0, 0, 0, 0, 0, 0]

# s[i] = min(s[i-k] + max(len(p[i]))*k)+11)


def split(p, n):
    for i in range(1, n+1):
        min_val = s[i-1] + store_bit_number(p[i])
        pos[i] = 1
        print "begin", i, min_val
        for k in range(1, i+1):
            max_bit_number = get_bit_number(p, i-k+1, i)
            cur_val = s[i - k] + max_bit_number*k
            if min_val > cur_val:
                min_val = cur_val
                pos[i] = k
        s[i] = min_val+11
        print "end", i, s[i]


def get_bit_number(p, k, i):
    max_bit_number = 0
    for j in range(k, i+1):
        cur_bit_number = store_bit_number(p[j])
        if cur_bit_number > max_bit_number:
            max_bit_number = cur_bit_number
    return max_bit_number


def get_segments(pos, n, segment):
    if n == 0:
        return
    get_segments(pos, n-pos[n], segment)
    print n, n-pos[n]
    segment.append([n-pos[n], pos[n]])


split(p, 6)
print pos
segment = []
get_segments(pos, 6, segment)
print segment

posted @ 2016-05-06 19:24  zhaodonglin  Views(97)  Comments(0)    收藏  举报