题目:剪绳子
答案:
1.动态规划
f(n) = max(f(i)*f(n-i)), 0<i<n
class Solution {
public int cuttingRope(int n) {
if(n < 2) return 0;
if(n == 2) return 1;
if(n == 3) return 2;
int[] products = new int[n+1];
products[0] = 0;
products[1] = 1;
products[2] = 2;
products[3] = 3;
int max = 0;
for(int i = 4; i <= n; i++) {
max = 0;
for(int j = 1; j <= i/2; j++) {
int product = products[j]*products[i-j];
if(max < product) max = product;
products[i] = max;
}
}
return products[n];
}
}
2.贪心算法
n≥5时,我们尽可能多地剪长度为3的绳子
可以证明3(n-3)>n , 2(n-2)>n. 3(n-3)≥2(n-2)
class Solution {
public int cuttingRope(int n) {
if(n == 2) {
return 1;
}
if(n == 3){
return 2;
}
int mod = (int)1e9 + 7;
long res = 1;
while(n > 4) {
res *= 3;
res %= mod;
n -= 3;
}
return (int)(res * n % mod);
}
}