. - 力扣(LeetCode)
这是区间问题,f[i][j] 是在{nums[i]::nums[j]}的获得的最大零钱数,跟回文字符串的思路差不多。
方法一: i ∈{0:: n-1} 从左往右来看。
class Solution {
public:int maxCoins(vector<int>& nums) {int n=nums.size();vector<vector<int>> f(n+2, vector<int>(n+2));vector<int> val(n+2);val[0]=val[n+1]=1;for(int i=1;i<=n;i++)val[i] = nums[i-1];int res=0;for(int L=3;L<=n+2;L++){for(int i=0;i<=n-1;i++){int j=i+L-1;if(j>=n+2)break;for(int k=i+1;k<j;k++){int sum= val[i] *val[k] *val[j];sum=sum+f[i][k] +f[k][j];f[i][j] = max(f[i][j], sum);res=max(f[i][j], res);}}}return f[0][n+1];}
};
方法二:i从{n-1:: 0} 从右到左来看。
class Solution {
public:int maxCoins(vector<int>& nums) {int n=nums.size();vector<vector<int>> f(n+2, vector<int>(n+2));vector<int> val(n+2);val[0]=val[n+1]=1;for(int i=1;i<=n;i++)val[i] = nums[i-1];int res=0;for(int i=n-1;i>=0;i--){for(int j=i+2;j<n+2;j++){for(int k=i+1; k<j;k++){int sum=val[i] *val[k] *val[j];sum+=f[i][k] +f[k][j];f[i][j] = max(f[i][j], sum);}}}return f[0][n+1];}
};