题解:
找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,n-2,slices,k,dp); dp=vector<vector<int>>(n,vector<int>(k+1,-1)); int r2=dfs(1,n-1,slices,k,dp); return max(r1,r2); } int dfs(int idx, int right, vector<int>& slices, int k, vector<vector<int>> &dp){ if(k==0 || idx>right) return 0; if(dp[idx][k]!=-1) return dp[idx][k]; return dp[idx][k]=max(slices[idx]+dfs(idx+2,right,slices,k-1,dp), dfs(idx+1,right,slices,k,dp)); } };