例子:
最近被披萨搞麻了,连着两个 h a r d hard hard , 本题的思想需要转变:
每次选取一块披萨时,都将披萨的相邻两片选取中,其实也就是每次选取三块披萨,即当选取了某一块披萨时,下一次选取不能选其相邻的披萨。
通过这时可以看出其实就是一个环形的动态规划问题,且取第一块披萨则不能取最后一块披萨。
采用动态规划的思路来解决,由于是环形的动态规划,则进行两次计算,分别计算从 0 0 0 到 l e n g t h − 1 length-1 length−1 和从 1 1 1 到 l e n g t h length length 长度的数组 s l i c e s slices slices 中取披萨的最大值,再取最大即可得到答案。
注意在传参数时需要对数组长度加1,不然会导致披萨的选取次数减少而错误( p s ps ps: 看了好久才看出来)
代码如下:
class Solution {
public int maxSizeSlices(int[] slices) {
int[] slices1 = new int[slices.length-1];
System.arraycopy(slices,0,slices1,0,slices1.length);
int num1 = maxNum(slices1);
int[] slices2 = new int[slices.length-1];
System.arraycopy(slices,1,slices2,0,slices2.length);
int num2 = maxNum(slices2);
return Math.max(num1,num2);
}
public int maxNum(int[] slices){
int len = slices.length;
int n = (len+1)/3;
int[][] dp = new int[n+1][len];
dp[0][0] = 0;
dp[1][0] = slices[0];
dp[1][1] = Math.max(slices[0],slices[1]);
for(int i=1;i<=n;i++){
for(int j=2;j<=len-1;j++){
dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j-2]+slices[j]);
}
}
return dp[n][len-1];
}
}