class Solution {
public int maxSizeSlices(int[] slices) {
int n = slices.length,m = n / 3;
return Math.max(h(slices,1,n - 1),h(slices,2,n));
//第一个和最后一个不可以同时选 因此俩种情况分开计算
}
public int h(int[] slices,int s,int e){
int n = slices.length,m = n / 3;
int d[][] = new int[n + 1][m + 1];
for(int i = s; i <= e; i++){
for(int j = 1; j <= Math.min(i,m);j++){
d[i][j] = Math.max(d[i - 1][j],(i >= 2 ? d[i - 2][j - 1]:0)+ slices[i - 1]);
}
}
return d[e][m];
}
}
/*
打家劫舍变形:
看着逻辑简单,但是问题:用啥算法?怎么确定哪一个开始,然后再怎么选?
线性看:那不就是在3n元素中找n个不连续的元素实现和最大!
动态规划:
dp[i][j]表示前i个元素中选出j个不相邻元素的最大值
*/
区间dp(1388. 3n 块披萨)
最新推荐文章于 2024-11-05 21:58:11 发布