int ans = 0;
for (int i = 1; i <= n; i ++ )
for (int j = 0; j <= min(i,(int)30); j ++ ) {
dp[i][j] = dp[i - 1][j] + (a[i] >> j) - k;
if(j >= 1) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + (a[i] >> j));
ans = max(ans, dp[i][j]);
}
如果是放在dp方程里的话我能理解 就是 当j >= 30时 a[i] >> j = 0 那么就不用遍历j > 30的情况了 反正都一样