C ++中具有3n切片的披萨
假设有一个披萨,该披萨的3n片大小不一,我和我的两个朋友将按照以下方式切片披萨-
我将挑选任何披萨片。
我的朋友Amal将按我的选择的逆时针方向选择下一个切片。
我的朋友Bimal将按照我的选择顺时针方向选择下一个切片。
重复这些步骤,直到不再有匹萨饼。
披萨片的大小由顺时针方向上的圆形阵列片表示。我们必须找到我可以拥有的最大切片大小总和。
因此,如果输入类似于[9,8,6,1,1,8],
那么输出将为16,因为每回合选择大小为8的披萨片。如果我选择9号片,我的朋友们将选择8号片。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数solve()
,它将接受一个数组v和一个参数m,
n:=v的大小
分别定义两个大小为(n+1)x(m+1)的2D数组dp1和dp2
对于初始化i:=0,当i<n时,更新(将i增加1),执行-
x:=v[i]
如果j<m,则-
dp2[i+1,j+1]=dp2[i+1,j+1]和dp1[i,j]+x的最大值)
dp1[i+1,j]=dp1[i+1,j],dp2[i,j]和dp1[i,j]的最大值
对于初始化j:=0,当j<=m时,更新(将j增加1),执行-
返回dp1[n,m]和dp2[n,m]的最大值
从主要方法中执行以下操作-
n:=切片的大小
ret:=0
ret:=求解的最大值(从索引1到结尾的切片,n/3)和slices[0]+求解(从索引2到结尾的切片-1,n/3-1)
返回ret
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h> using namespace std; class Solution { public: int solve(vector <int> v, int m){ int n = v.size(); vector<vector<int> > dp1(n + 1, vector<int>(m + 1)); vector<vector<int> > dp2(n + 1, vector<int>(m + 1)); for (int i = 0; i < n; i++) { for (int j = 0; j <= m; j++) { int x = v[i]; if (j < m) dp2[i + 1][j + 1] = max(dp2[i + 1][j + 1], dp1[i] [j] + x); dp1[i + 1][j] = max({ dp1[i + 1][j], dp2[i][j], dp1[i][j] }); } } return max(dp1[n][m], dp2[n][m]); } int maxSizeSlices(vector<int>& slices) { int n = slices.size(); int ret = 0; ret = max(solve(vector<int>(slices.begin() + 1, slices.end()), n / 3), slices[0] + solve(vector<int>(slices.begin() + 2, slices.end() - 1), n / 3 - 1)); return ret; } }; main(){ Solution ob; vector<int> v = {9,8,6,1,1,8}; cout << (ob.maxSizeSlices(v)); }
输入值
{9,8,6,1,1,8}
输出结果
16