3n块披萨

发布时间 2023-08-18 02:42:30作者: 失控D大白兔

给你一个披萨,它由 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));
    }
};