我们要求找出具有下列性质数的个数(包含输入的正整数 n)。
先输入一个正整数 n(1≤n≤1000),然后对此正整数按照如下方法进行处理:
- 不作任何处理;
- 在它的右边拼接一个正整数,但该正整数不能超过原数,或者是上一个被拼接的数的一半;
- 加上数后,继续按此规则进行处理,直到不能再加正整数为止。
说明/提示
样例 1 解释
满足条件的数列为:
- 6
- 6,1
- 6,2
- 6,3
- 6,2,1
- 6,3,1
数据规模与约定
对于全部的测试点,保证 1≤n≤1000
暴力递归
package 洛谷;
import java.util.Scanner;
public class Main22 {
static int count=1;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
Main22 a=new Main22();
a.shulie(n);
System.out.println(count);
}
public int shulie(int m) {
int x=m/2;
count+=x;
for(;x>=1;x--)
shulie(x);
return count;
}
}
刚做这题时想到了递归,结果发现TLE了。好多人说可以记忆化搜索,于是尝试了解试了一下
记忆化搜索的本质:动态规划。
记忆化搜索是动态规划的一种实现方式,记忆化搜索是用搜索的方式实现了动态规划,因此记忆化搜索就是动态规划。这样去处理的话就无需进行重复计算了,相比前面的暴力递归就显得高效明智得多
记忆化搜索
import java.util.Scanner;
public class Main {
static int f[]=new int[1001];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
f[1]=1;
f[2]=2;
f[3]=2;
f[4]=4;
f[5]=4;
Main a=new Main();
a.shulie(n);
System.out.println(f[n]);
}
public int shulie(int m) {
if(f[m]!=0)
return f[m];
else{
int count=1;
for(int x=1;x<=m/2;x++) {
count+=shulie(x);
}
return f[m]=count;
}
}
}