classSolution { public: staticconstint N = 510; int dp[N][N];
intmaxCoins(vector<int>& nums){ int n = nums.size(); nums.insert(nums.begin(), 1); nums.push_back(1); memset(dp, -1, sizeof dp); int res = dfs(1, n, nums); return res; }
intdfs(int l, int r, vector<int>& nums){ if (dp[l][r] != -1) return dp[l][r]; if (l > r) return0; int res = 0; for (int k = l; k <= r; ++k) { res = max(res, nums[l-1]*nums[k]*nums[r+1]+dfs(l, k-1, nums)+dfs(k+1, r, nums)); } return dp[l][r] = res; } };
动态规划(c++)
classSolution { public: staticconstint N = 510; int dp[N][N];
intmaxCoins(vector<int>& nums){ int n = nums.size(); nums.insert(nums.begin(), 1); nums.push_back(1); memset(dp, 0, sizeof dp); for (int len = 1; len <= n; ++len) { for (int i = 1; i+len-1 <= n; ++i) { int j = i + len - 1; for (int k = i; k <= j; ++k) { dp[i][j] = max(dp[i][j], nums[i-1]*nums[k]*nums[j+1] + dp[i][k-1] + dp[k+1][j]); } } } return dp[1][n]; } };
dfs+记忆化搜索(python)
classSolution: defmaxCoins(self, nums: List[int]) -> int: n = len(nums) nums = [1] + nums + [1] self.dp = [[-1]*(n+2) for _ inrange(n+2)] res = self.dfs(1, n, nums) return res
defdfs(self, l, r, nums): ifself.dp[l][r] != -1: returnself.dp[l][r] if l > r: return0 res = 0 for k inrange(l, r+1): res = max(res, nums[l-1]*nums[k]*nums[r+1]+self.dfs(l, k-1, nums)+self.dfs(k+1, r, nums)) self.dp[l][r] = res return res
动态规划(python)
classSolution: defmaxCoins(self, nums: List[int]) -> int: n = len(nums) nums = [1] + nums + [1] dp = [[0]*(n+2) for _ inrange(n+2)] for l inrange(1, n+1): for i inrange(1, n-l+2): j = i + l - 1 for k inrange(i, j+1): dp[i][j] = max(dp[i][j], nums[i-1]*nums[k]*nums[j+1] + dp[i][k-1] + dp[k+1][j]) return dp[1][n]