Skip to content

Latest commit

 

History

History
60 lines (50 loc) · 1.59 KB

Largest_none_close_sum.md

File metadata and controls

60 lines (50 loc) · 1.59 KB

safes = [2, 5, 4, 10, 7, 2, 6, 8, 1, 10] x x x x x

Given an array of numbers, choose the numbers that cannot become neighbor to each other, find out the largest sum

Note: Three ways of solutions:

Similar to leetcode "House Robber"

# 3 ways to resolve this problem
# First, DP
# State: dp[i] means the max none close sum from 0...to..i
# Initialization: dp[0] = 0, dp[1] = max(dp[0], dp[1])
# Function: dp[i] = (dp[i-2]+nu[i], dp[i-1])
# Result: dp[n-1]
def find_largest_none_close_sum(A):
    length = len(A)
    dp = [0 for i in xrange(length)]
    dp[0] = A[0]
    
    for i in xrange(1, length):
        if i == 1:
            dp[1] = max(A[0],A[1])
        else:
            dp[i] = max((dp[i-2]+A[i]), dp[i-1])
    return dp[length-1]

# Greedy
def find_largest_none_close_sum_1(A):
    a = 0 
    b = 0 
    for i in xrange(len(A)):
        if i % 2 == 0:
            a = max(a+A[i], b)
        else:
            b = max(b+A[i], a)
    return max(a, b)

# The other dp
def find_largest_none_close_sum_2(A):
    length = len(A)
    value = [0,0]
    if not A: return 0
    value[0] = A[0]
    for i in xrange(1, length):
        if i == 1:
            value[1] = max(A[0],A[1])
        else:
            tmp = value[1]
            value[1] = max(A[i]+value[0], value[1])
            value[0] = tmp
    return value[1]        
                                        

num = [2, 5, 4, 10, 7, 2, 6, 8, 1, 10]
print "result1: ", find_largest_none_close_sum(num)
print "result2: ", find_largest_none_close_sum_1(num)
print "result3: ", find_largest_none_close_sum_2(num)