def find_max_gain_alignment(arr1, arr2, gain_matrix): m = len(arr1) n = len(arr2) dp = [[0] * (n + 1) for _ in range(m + 1)] directions = [[None] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): for j in range(1, n + 1): gain = gain_matrix[i-1][j-1] dp[i][j] = max(dp[i-1][j-1] + gain, dp[i][j-1], dp[i-1][j]) if dp[i][j] == dp[i-1][j-1] + gain: directions[i][j] = "diagonal" elif dp[i][j] == dp[i][j-1]: directions[i][j] = "left" else: directions[i][j] = "up" aligned_arr1 = [] aligned_arr2 = [] i=m j=n while i > 0 and j > 0: if directions[i][j] == "diagonal": aligned_arr1.append(arr1[i-1]) aligned_arr2.append(arr2[j-1]) i -= 1 j -= 1 elif directions[i][j] == "left": aligned_arr1.append(None) aligned_arr2.append(arr2[j-1]) j -= 1 else: aligned_arr1.append(arr1[i-1]) aligned_arr2.append(None) i -= 1 aligned_arr1.reverse() aligned_arr2.reverse() return aligned_arr1, aligned_arr2 # Örnek kullanım arr1 = [1, 2, 3, 4, 5] arr2 = [2, 4, 6, 8, 10] gain_matrix = [[3, 2, 1, 4, 5], [2, 5, 6, 1, 3], [4, 2, 1, 5, 3], [1, 6, 4, 3, 2], [3, 1, 2, 4, 5]] aligned_arr1, aligned_arr2 = find_max_gain_alignment(arr1, arr2, gain_matrix) print("Dizi 1:", aligned_arr1) print("Dizi 2:", aligned_arr2) A) dp[i][j] = max(dp[i-1][j-1] + gain_matrix[i-1][j-1], dp[i][j-1], dp[i-1][j]) def find_max_gain_alignment(arr1, arr2, gain_matrix): m = len(arr1) n = len(arr2) # Dinamik programlama tablosu dp = [[0] * (n + 1) for _ in range(m + 1)] # Geri izleme için yönler directions = [[None] * (n + 1) for _ in range(m + 1)] # Dinamik programlama tablosunu doldurma for i in range(1, m + 1): for j in range(1, n + 1): gain = gain_matrix[i-1][j-1] # Kazanç matrisinden ilgili kazanç değerini al dp[i][j] = max(dp[i-1][j-1] + gain, dp[i][j-1], dp[i-1][j]) # En yüksek kazançlı yolu belirleme if dp[i][j] == dp[i-1][j-1] + gain: directions[i][j] = "diagonal" elif dp[i][j] == dp[i][j-1]: directions[i][j] = "left" else: directions[i][j] = "up" # En yüksek kazançlı ardışıl alt dizi hizalamasını bulma aligned_arr1 = [] aligned_arr2 = [] i=m j=n while i > 0 and j > 0: if directions[i][j] == "diagonal": aligned_arr1.append(arr1[i-1]) aligned_arr2.append(arr2[j-1]) i -= 1 j -= 1 elif directions[i][j] == "left": aligned_arr1.append(None) aligned_arr2.append(arr2[j-1]) j -= 1 else: aligned_arr1.append(arr1[i-1]) aligned_arr2.append(None) i -= 1 aligned_arr1.reverse() aligned_arr2.reverse() return aligned_arr1, aligned_arr2 # Örnek kullanım arr1 = [1, 2, 3, 4, 5] arr2 = [2, 4, 6, 8, 10] gain_matrix = [[3, 2, 1, 4, 5], [2, 5, 6, 1, 3], [4, 2, 1, 5, 3], [1, 6, 4, 3, 2], [3, 1, 2, 4, 5]] aligned_arr1, aligned_arr2 = find_max_gain_alignment(arr1, arr2, gain_matrix) print("Dizi 1:", aligned_arr1) print("Dizi 2:", aligned_arr2) Dinamik programlama algoritmasının zaman ve yer karmaşıklığı şu şekilde hesaplanabilir: - Zaman Karmaşıklığı: Dinamik programlama tablosunu doldurmak için kullanılan iki for döngüsü, m ve n değerlerine bağlı olarak çalışır. Her bir hücreyi hesaplama işlemi sabit bir zaman alır. Dolayısıyla, zaman karmaşıklığı O(mn) olur. - Yer Karmaşıklığı: Dinamik programlama tablosu, m+1 satır ve n+1 sütundan oluşur, yani (m+1) x (n+1) boyutundadır. Bu nedenle, yer karmaşıklığı O(mn) olur. Özetle, dinamik programlama algoritmasının zaman ve yer karmaşıklığı O(mn) olarak hesaplanır.