3n块披萨
给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨
每选一块,周围两块会被其他人分掉,请你返回你可以获得的披萨大小总和的最大值。
1. 动态规划
class Solution {
public:
int maxSizeSlices(vector<int>& slices) {
int n = slices.size(); int k = n/3;
int dp[n][k+1];//动态规划,dp[i][j]表示前i个元素中,选择不相邻的j个元素最大值
function<int(int)> f = [&](int flag)->int{
memset(dp,0,sizeof(dp));
dp[0][1] = slices[0+flag];
dp[1][1] = max(slices[0+flag],slices[1+flag]);//必须初始化,避免越界
for(int i=2;i<n-1;i++)//遍历n-1个数,已经初始化两个
for(int j=1;j<=(i+2)/2&&j<=k;j++)//遍历已选个数范围,保证无后效性
dp[i][j] = max(dp[i-1][j],dp[i-2][j-1]+slices[i+flag]);//选与不选
return dp[n-2][k];
};
return max(f(0), f(1));
}
};