Python程式:透過刪除數字找到最大加法得分
假設我們有一個名為nums的數字列表。我們考慮一個操作,我們可以選擇一個數字,然後將其移除,並將我們的分數增加所選數字及其兩個相鄰數字之和。只要我們不選擇列表中的第一個或最後一個數字,我們就可以執行此操作任意多次。我們必須找到可能的最大分數。
因此,如果輸入類似於nums = [2, 3, 4, 5, 6],則輸出將為39,因為我們可以選擇5,則總和為(4 + 5 + 6) = 15,陣列將為[2, 3, 4, 6],然後選擇4,所以總和是(3 + 4 + 6) = 13,陣列將為[2, 3, 6],選擇3,總和將為(2 + 3 + 6) = 11,所以總和為15 + 13 + 11 = 39
為了解決這個問題,我們將遵循以下步驟:
- n := nums的大小
- 如果 n < 3,則
- 定義一個大小為(n + 1) x (n + 1) 的二維陣列
- 用於初始化len := 3,當len <= n時,更新(len加1),執行:
- 用於初始化i := 1,當i + len - 1 <= n時,更新(i加1),執行:
- r := i + len - 1
- ans := 0
- 用於初始化k := i + 1,當k <= r - 1時,更新(k加1),執行:
- curr := dp[i, k] + dp[k, r] + nums[k - 1]
- 如果curr > ans,則
- ans := ans + nums[i - 1] + nums[r - 1]
- dp[i, r] := ans
- 用於初始化i := 1,當i + len - 1 <= n時,更新(i加1),執行:
- 返回dp[1, n]
讓我們看下面的實現來更好地理解:
示例
#include <bits/stdc++.h> using namespace std; class Solution { public: int solve(vector<int>& nums) { int n = nums.size(); if (n < 3) return 0; vector<vector<int>> dp(n + 1, vector<int>(n + 1)); for (int len = 3; len <= n; ++len) { for (int i = 1; i + len - 1 <= n; ++i) { int r = i + len - 1; int ans = 0; for (int k = i + 1; k <= r - 1; ++k) { int curr = dp[i][k] + dp[k][r] + nums[k - 1]; if (curr > ans) ans = curr; } ans += nums[i - 1] + nums[r - 1]; dp[i][r] = ans; } } return dp[1][n]; } }; int solve(vector<int>& nums) { return (new Solution())->solve(nums); } main(){ vector<int> v = {2, 3, 4, 5, 6}; cout << solve(v); }
輸入
[2, 3, 4, 5, 6]
輸出
39
廣告