สมมติว่าเรามีอาร์เรย์สองอาร์เรย์ arr1 และ arr2 ซึ่งสามารถเก็บตัวเลขจำนวนเต็มได้ เราต้องหาจำนวนการดำเนินการขั้นต่ำที่จำเป็นในการทำให้ arr1 เพิ่มขึ้นอย่างเคร่งครัด ที่นี่ เราสามารถเลือกดัชนีได้ 2 ตัว 0 <=i
หากเรา caPending-3n ไม่ได้ทำให้อาร์เรย์ arr1 เพิ่มขึ้นอย่างเคร่งครัด ให้คืนค่า -1
ดังนั้น หากอินพุตเป็นเหมือน arr1 =[1,5,3,7,8], arr2 =[1,3,2,5] ผลลัพธ์จะเป็น 1 เนื่องจากเราสามารถแทนที่ 5 ด้วย 2 ได้ อาร์เรย์จะเป็น [1,2,3,7,8]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้อาร์เรย์ arr1, อาร์เรย์ arr2, i, j, ก่อนหน้า, อาร์เรย์ 2D หนึ่งรายการ dp,
-
ถ้า i>=ขนาดของ arr1 แล้ว −
-
กลับ 1
-
-
j =องค์ประกอบแรกของ subarray ของ arr2 จาก arr2[j] และบน
-
ถ้า dp[i, j] ไม่เท่ากับ -1 แล้ว −
-
กลับ dp[i, j]
-
-
ret :=ขนาดของ arr2 + 1
-
ถ้าก่อนหน้า
-
ret :=ขั้นต่ำของ ret และแก้ปัญหา (arr1, arr2, i + 1, j, arr1[i], dp)
-
-
ถ้า j <ขนาดของ arr2 แล้ว −
-
ret :=ขั้นต่ำของ ret และ 1 + แก้ (arr1, arr2, i + 1, j, arr2[j], dp)
-
-
กลับ dp[i, j] =ret
-
จากวิธีหลัก ให้ทำดังนี้ −
-
จัดเรียงอาร์เรย์ arr2
-
n :=ขนาดของ arr1
-
m :=ขนาดของ arr2
-
กำหนด dp อาร์เรย์ 2 มิติหนึ่ง dp ขนาด 2005 x 2005 และเติมด้วย -1
-
ret :=แก้ (arr1, arr2, 0, 0, -inf, dp)
-
return (ถ้า ret> ขนาดของ arr2 แล้ว -1 มิฉะนั้น ret - 1)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int solve(vector<int>& arr1, vector<int>& arr2, int i, int j, int prev, vector<vector<int> >& dp){ if (i >= arr1.size()) return 1; j = upper_bound(arr2.begin() + j, arr2.end(), prev) - arr2.begin(); if (dp[i][j] != -1) return dp[i][j]; int ret = arr2.size() + 1; if (prev < arr1[i]) { ret = min(ret, solve(arr1, arr2, i + 1, j, arr1[i], dp)); } if (j < arr2.size()) { ret = min(ret, 1 + solve(arr1, arr2, i + 1, j, arr2[j], dp)); } return dp[i][j] = ret; } int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2){ sort(arr2.begin(), arr2.end()); int n = arr1.size(); int m = arr2.size(); vector<vector<int> > dp(2005, vector<int>(2005, -1)); int ret = solve(arr1, arr2, 0, 0, INT_MIN, dp); return ret > arr2.size() ? -1 : ret - 1; } }; main(){ Solution ob; vector<int> v = {1,5,3,7,8}, v1 = {1,3,2,5}; cout << (ob.makeArrayIncreasing(v,v1)); }
อินพุต
{1,5,3,7,8}, {1,3,2,5}
ผลลัพธ์
1