------
## 最终结论
```python
def jobScheduling(startTime, endTime, profit):
    jobs = sorted(zip(startTime, endTime, profit), key=lambda x: x[1])
    n = len(jobs)
    
    # Initialize DP array
    dp = [0] * (n + 1)

    for i in range(1, n + 1):
        current_start = jobs[i - 1][0]
        current_end = jobs[i - 1][1]
        current_profit = jobs[i - 1][2]
        
        # Find the latest job that doesn't overlap with the current job using binary search
        j = binary_search(jobs, current_start, i)
        
        # Update DP value for the current job
        dp[i] = max(dp[i - 1], dp[j] + current_profit)

    return dp[n]

def binary_search(jobs, start_time, upper_bound):
    low, high = 0, upper_bound - 1
    while low < high:
        mid = (low + high) // 2
        if jobs[mid][1] <= start_time:
            low = mid + 1
        else:
            high = mid
    return low

# Example usage
startTime = [1, 2, 3, 3]
endTime = [3, 4, 5, 6]
profit = [50, 10, 40, 70]
max_profit = jobScheduling(startTime, endTime, profit)
print(max_profit)  # Output: 120
```