剪绳子
dp方程 max(dp[i],dp[i-j]*dp[j],dp[i-j]*j,(i-j)*dp[j],(i-j)*j)
public int cuttingRope(int n) {
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 1;
for(int i = 3;i <= n;i++){
for(int j = 1;j <= i/2;j++){
//dp[i],dp[i-j]*dp[j],dp[i-j]*j,(i-j)*dp[j],(i-j)*j
dp[i] = Math.max(dp[i],Math.max(dp[i-j] * dp[j],Math.max((i - j) * dp[j],Math.max(dp[i-j]*j,(i-j)*j))));
}
}
return dp[n];
}
归纳法
n = 5,3 * 2
n = 6,3 * 3
n = 7,3 * 4
n = 8,3 * 3 * 2
n = 9,3 * 3 * 3
扩展 n > 4时,max = 3 * m * (n - 3m)
public int cuttingRope(int n) {
if(n == 2)
return 1;
if(n == 3)
return 2;
int res = 1;
while(n > 4){
res *= 3;
n -= 3;
}
return res * n;
}
二进制1的个数
无符号右移 >>>
public int hammingWeight(int n) {
int num = 0;
while (n != 0){
if ((n&1) == 1){
num ++;
}
n = n >>> 1;
}
return num;
}
实现阶乘
public double myPow(double x, int n) {
if(n == 0) return 1;
if(n == 1) return x;
if(n == -1) return 1 / x;
double half = myPow(x, n / 2);
double mod = myPow(x, n % 2);
return half * half * mod;
}