Cho mảng A có N số nguyên và mảng B chứa M số nguyên. Tìm tổng lớn nhất của các mảng con trong A mà không chứa phần bất kỳ phần tử nào của B.
Ví dụ:
Input: A = {1, 4, 6, 7, 9}, B = {4, 8, 9} Ta xem các phần tử trong A mà có chứa trong B là một điểm khuyết, A = {1, !, 6, 7, ! } |
Trước khi làm bài này, chúng ta cần biết đến thuật toán Kadane’s Algorithm. Kadane’s Algorithm là thuật toán tính tổng lớn nhất của các mảng con.
Note: Nếu giá trị trả về = 0, thì chuỗi con có tổng lớn nhất là {}.
public class Main { public static void main(String[] args) { int A[] = {1, 4, 6, 7, 9}; int B[] = {4, 8, 9}; int n = A.length; int m = B.length; System.out.println("Maximum Subarray Sum: " + maxSubArraySum(A, n, B, m)); } public static boolean contain(int[] arr, int m, int value) { for (int item : arr) { if (item == value) return true; } return false; } static int maxSubArraySum(int a[], int n, int[] b, int m) { int max_so_far = Integer.MIN_VALUE, max_ending_here = 0; for (int i = 0; i < n; i++) { max_ending_here = max_ending_here + a[i]; if (contain(b, m, a[i])) max_ending_here = 0; if (max_ending_here < 0) max_ending_here = 0; if (max_so_far < max_ending_here) max_so_far = max_ending_here; } return max_so_far; } }
Output: Maximum Subarray Sum: 13 |
Độ phức tạp: θ(n * m)