LC 1388. Pizza With 3n Slices

link

 题解:

找n个互不相邻的披萨,求最大组合。若有两个相邻,a,b, 则吃a时b必须已经被吃掉,且是被自己吃掉;吃b时a必须已经被吃掉,且是被自己吃掉,矛盾,故互不相邻。

下面证明n个互不相邻的披萨可以顺利吃完。n=1满足条件。设n-1满足条件。n个披萨之间gap有n个,且这些gap被2n个披萨填充,故平均每个gap有两个披萨。则必然存在一个gap上有两个披萨。首先吃这个gap旁边的披萨,可以保证剩下的n-1个披萨不会相邻。

则问题转换为寻找n个不相邻的披萨,使得sum最大。注意0和3n-1不可同时取。故可以分两种情况,[0,3n-2], [1,3n-1]

class Solution {
public:
    int maxSizeSlices(vector<int>& slices) {
        int n=slices.size();
        int k=n/3;
        vector<vector<int>> dp(n,vector<int>(k+1,-1));
        int r1=dfs(0,slices,k,dp);
        vector<int> sli;
        for(int i=1;i<slices.size();i++){
            sli.push_back(slices[i]);
        }
        sli.push_back(slices[0]);
        dp=vector<vector<int>>(n,vector<int>(k+1,-1));
        int r2=dfs(0,sli,k,dp);
        return max(r1,r2);
    }
    
    int dfs(int idx, vector<int>& slices, int k,  vector<vector<int>> &dp){
        if(k==0 || idx>=slices.size()-1) return 0;
        
        if(dp[idx][k]!=-1) return dp[idx][k];
        
        return dp[idx][k]=max(slices[idx]+dfs(idx+2,slices,k-1,dp), dfs(idx+1,slices,k,dp));
    }
};

猜你喜欢

转载自www.cnblogs.com/FEIIEF/p/12546260.html