题目:
题解:
- 解释一:
- 解释二:
- 解释三:
- 解释四:
1. 题解一:动态规划 + 最低有效位
2. 题解二:动态规划 + 最后设置位
代码:
1. 代码一:动态规划 + 最低有效位
import java.util.*;
public class code338 {
// 方法1: 动态规划 + 最低有效位
public static int[] countBits(int num) {
int res[] = new int[num + 1];
for(int i = 1; i <= num; i++)
{
res[i] = res[i >> 1] + (i & 1); // (x / 2) is (x >> 1) and (x % 2) is (x & 1), 注意 (i & 1) 需要加括号
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt())
{
int num = sc.nextInt();
int res[] = countBits(num);
for(int i = 0; i <= num; i++)
{
System.out.print(res[i] + " ");
}
System.out.println();
}
}
}
2. 代码二:动态规划 + 最后设置位
import java.util.*;
public class code338 {
// 方法2: 动态规划 + 最后设置位
public static int[] countBits(int num) {
int res[] = new int[num + 1];
for(int i = 1; i <= num; i++)
{
res[i] = res[i & (i - 1)] + 1; // 注意要从1开始,0不满足
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt())
{
int num = sc.nextInt();
int res[] = countBits(num);
for(int i = 0; i <= num; i++)
{
System.out.print(res[i] + " ");
}
System.out.println();
}
}
}