这道题需要考虑清楚,该问题可以转化为给一个长度为3K的数组,从中选择不相邻(包括首尾不相连)的K个点,从而使得和最大。(只要满足上述条件即可)
然后,首尾不可能同时取到,因此把他的环拆开,分成两种情况分析。
这个问题用递归求解会超时(重复计算了),必须用dp开辟空间求解。
class Solution {
public:
int func(vector<int>& slices, int K){
int row = slices.size()+2;
int col = K+1;
vector<int> temp(col, 0); // 3
vector<vector<int>> dp(row, temp); // (7, 3) all 0
for(int i=2;i<row;i++){
for(int k=1;k<col;k++){
//cout<<i<<" "<<k<<endl;
dp[i][k] = max(slices[i-2]+dp[i-2][k-1], dp[i-1][k]);
}
}
return dp[row-1][col-1];
}
int maxSizeSlices(vector<int>& slices) {
int K = slices.size()/3; // K=1 123
vector<int> case1(slices.begin(), slices.end()-1);// 12
vector<int> case2(slices.begin()+1, slices.end());//23
return max(func(case1, K), func(case2, K));
}
};