首页 > 其他分享 >记忆化搜索 P1028 数的计算

记忆化搜索 P1028 数的计算

时间:2023-05-03 21:55:47浏览次数:45  
标签:int 搜索 计算 序列 记忆 include P1028 dp

P1028 [NOIP2001 普及组] 数的计算 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一开始是想暴力搜索的,也就是枚举比n/2小的数,但是只过了5个点,其他点都TLE

然后就开始想有没有优化方法

以6为例子

6/2=3,那么以6为首的长度为2的序列就有61,62,63,也就是所有小于等于3的数的个数

接下来,我们找长度为3的序列的个数,只需要关注第二位的数字即可, 也就是说只需要找到以1,2,3为首的序列的个数相加即可

至此可以知道N[6]=N[3]+N[2]+N[1]+1;同理,N[3]=N[1]+1,N[2]=N[1]+1,N[1]=1;

这里的加1指的是只有首元素的序列,由此我们可以得出N[k]=N[1]+N[2]+......+N[k/2]+1的递推公式,这样递推下去,知道推到初始值N[1]=1就可以得出答案了

同时防止重复计算某个位置的值,采用记忆化搜索策略,否则还是会TLE

AC代码

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int cnt = 1;
 6 int dp[1010] = { 0 };
 7 int Solve(int n)
 8 {
 9     
10     if (dp[n] == 0)//当此位置为被计算过才进行计算后返回,否则直接返回
11     {
12         if (n == 1)
13         {
14             dp[n] = 1;
15             return dp[n];//边界返回
16         }
17         for (int i = 1; i <= n / 2; i++)
18         {
19             dp[n] += Solve(i);//累加
20         }
21         dp[n] += 1;
22     }
23     return dp[n];
24 }
25 int main()
26 {
27     int n;
28     cin >> n;
29     Solve(n);
30    cout << dp[n];
31 }

 

标签:int,搜索,计算,序列,记忆,include,P1028,dp
From: https://www.cnblogs.com/WKWKSL/p/17369757.html

相关文章

  • 2.八数码II(搜索进阶 IDA*估价函数 + 迭代加深)
    八数码II↑题目链接题目在一个\(3×3\)的网格中,\(1∼8\)这8个数字和一个X恰好不重不漏地分布在这\(3×3\)的网格中。例如:123X46758在游戏过程中,可以把X与其上、下、左、右四个方向之一的数字交换(如果存在)。把X与上下左右方向数字交换的行动记录为u......
  • 1.八数码 (搜索进阶 BFS)
    八数码题目在一个\(3×3\)的网格中,\(1∼8\)这\(8\)个数字和一个\(X\)恰好不重不漏地分布在这\(3×3\)的网格中。例如:123X46758在游戏过程中,可以把X与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正......
  • 专访Evernote CEO Phil Libin:Evernote想留住你的记忆而不是你的Money
    在伦敦举行的 LeWeb大会以后,Evernote CEO PhilLibin 提到,Evernote现在的用户数量已从五月份的2500万上升到六月份的3400万,付费用户虽然比率仍旧很小,但也在快速增长,从五月份的100万增长到六月份的140万。就Evernote今后的发展计划,著名科技博客TechCrunch编辑INGRIDLUNDEN对Ev......
  • 10.起火迷宫(简单搜索 多源BFS)
    起火迷宫↑题目链接题目一个迷宫可以看作一个\(R\)行\(C\)列的方格矩阵。其中一些方格是空地,用.表示,其他方格是障碍,用#表示。开始时,乔位于一块空地之中。迷宫中一些空地已经起火了,幸运的是火还没有蔓延至乔所在的位置。为了避免被火烧伤,乔需要尽快逃离迷宫。已知......
  • 12.石油储备(简单搜索 DFS/BFS 统计连通块个数)
    石油储备题目一片土地可以看作是一个\(n\)行\(m\)列的方格矩阵。其中一些方格藏有石油,用@表示,其余方格没有石油,用*表示。每个方格都与其上、下、左、右、左上、右上、左下、右下八个方格视为相邻。如果两个藏有石油的方格相邻,则它们被认为是处于同一片油田,否则它们被......
  • 14.找路(简单搜索 BFS 最短步数)
    找路↑题目链接题目给定一个\(n\)行\(m\)列的方格矩阵。其中有些方格是空地(可以进入),有些方格是餐厅(可以进入),有些方格是障碍(不可进入)。开始时,小\(Y\)和小\(M\)各自位于一个空地方格中。每个人都可以沿上下左右四个方向进行移动,移动一格距离需要花费\(11\)分钟时间。......
  • 9.点火游戏(简单搜索 BFS)
    点火游戏↑题目链接题目给定一个\(N\)行\(M\)列的方格矩阵。其中一部分方格是草地,其余部分是空地。草地能够被燃烧,空地不会。当某个草地在\(t\)时刻被点燃时,其上下左右四个方向的相邻方格中的草地方格也会在\(t+1\)时刻被点燃。注意,空地方格无论如何都不可能被点燃。......
  • 13.非常可乐(简单搜索 BFS)
    非常可乐题目大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是\(N\)毫升和\(M\)毫升。可......
  • 8.罐子(简单搜索 BFS最短步数+记录方案)
    罐子↑题目链接题目给你两个罐子,容积分别为\(A\)升和\(B\)升。现在,你可以进行如下三种操作:FILL(i),将罐子\(i(1≤i≤2)\)灌满水。DROP(i),将罐子\(i(1≤i≤2)\)清空。POUR(i,j),将罐子\(i\)中的水倒向罐子\(j\),直到罐子\(i\)空了或罐子\(j\)满了为止。请问,至少......
  • 7.洗牌(简单搜索 BFS)
    洗牌↑题目链接题目给定两叠纸牌\(S1\)和\(S2\),每叠恰好有\(C\)张牌。每张牌的尺寸大小都完全相同,但是颜色可能不同。下面介绍洗牌规则。不妨设\(S1\)中纸牌从上到下编号依次为\(a_1,a_2,…,a_C\),\(S_2\)中纸牌从上到下编号依次为\(b_1,b_2,…,b_C\)。洗牌就......