復盤|第353場周賽
找出最大的可達成數字
【數學】t次操作,num+t = X-t,得num + 2 * t = X。
達到末尾下標所需的最大跳躍次數
【線性DP-記憶化搜索實現】倒著思考,從n-1倒著跳到0,每次跳躍可以把問題規(guī)??s小,定義dfs(i)為從i跳到0的最大跳躍次數,還是“枚舉選哪個”的思想,枚舉j,如果abs(nums[i] - nums[j]) <= target,那么有dfs(i) = dfs(j) + 1。取所有情況最大值即為dfs(i),沒有j則dfs(i) = -inf。遞歸入口dfs(n-1),遞歸邊界dfs(0)。
【線性DP-遞推實現】
構造最長非遞減子數組
【線性DP-記憶化搜索實現】定義dfs(i, j)為以numsj[i]結尾的最長非遞減子數組的長度,用“枚舉選哪個”的思想,如果nums1[i - 1] ≤ numsj[i],下一步選nums1[i - 1],有dfs(i,j) = dfs(i -1,0) + 1;如果nums2[i - 1] ≤ numsj[i],下一步選nums2[i - 1],有dfs(i,j) = dfs(i -1,1) + 1,ans=max(dfs(i,j) for ....),遞歸入口dfs(i,j),遞歸邊界dfs(0) = 1。
【線性DP-遞推實現 空間優(yōu)化】由于 f[i]只用到f[i-1],所以可以去掉第一個維度。
使數組中的所有元素都等于零
【差分數組】子數組同時減去一個數,適合用差分數組來維護,設差分數組為diff,把nums[i]到nums[i+k-1]同時減去1,等價于把diff[i]減一,diff[i+k]加1,注意到子數組長度必須恰好等于k,所以當i+k≤n時,才能執(zhí)行上述操作。遍歷數組同時,用diff_sm累加差分值,遍歷到nums[i]時,nums[i]+diff_sm就是nums[i]的實際值了,分類討論:如果nums[i]<0,無法讓元素值增大,返回false;如果nums[i]=0,無需操作遍歷下一個數,如果nums[i]>0:i+k>n則無法操作返回false;I+k≤n,修改差分數組遍歷下一個數。