【递推】P1028 数的计算

本文解析洛谷P1028题目,介绍了一种通过递归求解的方法,但指出其在大数据时会超时。随后提出了两种优化方案:一是预计算并存储1000种答案;二是通过观察递归结果找出规律,采用递推公式高效求解。最终给出了基于规律的递推解法代码。

题目链接:https://www.luogu.com.cn/problem/P1028

考点:找规律,递推

在这里插入图片描述题意:
给一个整数n(n≤1000),在n左边添加一个不大于n/2的数构成一个新数,然后对添加的数也做相同处理。统计所有可能性。
以10举例,可以有以下14种可能性:

110
210,1210,
310,1310,
410,1410,2410,12410,
510,1510,2510,12510,
10

解法一(递归):
理解了题意之后,不难写出递归的解法:

#include <bits/stdc++.h>
using namespace std;
int n,cnt=1;
int A[1005];
void dfs(int x){
	for(int i=1;i<=x/2;i++){
		cnt++;
		dfs(i);
	}
}
int main(){
	cin >> n;
	dfs(n);
	cout << cnt;
}

输出:

14

这个解法可以得出正确答案,但是数据大了会超时。接下来主要有两种做法,一种是用递归把1000种答案算出来,把答案写在代码里,根据输入来输出答案,时间复杂度是O(1),这样做的好处是不需要动脑,实在找不到规律就只能用这个笨办法了,题目数据是1000,所以花个几十分钟还是可以算出来的;第二种办法是小范围的打印出前几项答案,找规律,改用递推公式解。
在这里插入图片描述找规律的代码:

#include <bits/stdc++.h>
using namespace std;
int n,cnt=1;
int A[1005];
void dfs(int x){
	for(int i=1;i<=x/2;i++){
		cnt++;
		dfs(i);
	}
}
int main(){
	for (int i = 0; i <= 50; i++) {
		cnt = 1;
		dfs(i);
		printf("%d:%d\n", i, cnt);
		A[i] = cnt;
	}
}

输出:

0:1
1:1
2:2
3:2
4:4
5:4
6:6
7:6
8:10
9:10
10:14
11:14
12:20
13:20
14:26
15:26
16:36
17:36
18:46
19:46
20:60
...

解法二(递推):
根据以上结果,可以找出两条规律。
规律一:当n是奇数,A[i] = A[i-1]
规律二:当n是偶数,A[i] = A[i-1] + A[i/2]

因此答案如下:

#include <bits/stdc++.h>
using namespace std;
int A[1005]; // 记录答案
/* 根据题意算出前几项,以便找规律
  i     0 1 2 3 4 5 6 7  8  9 ...
  A[i]  1 1 2 2 4 4 6 6 10 10 ...
  规律一:当n是奇数,A[i] = A[i-1]
  规律二:当n是偶数,A[i] = A[i-1] + A[i/2]
*/
int main() {
	int n; cin >> n;
	A[0] = 1; A[1] = 1;
	for (int i = 2; i < 1000; i++) {
		if (i % 2 != 0) {
			A[i] = A[i-1];
		} else {
			A[i] = A[i-1] + A[i/2];
		}
	}
	cout << A[n];
    return 0;
}

这个A[i] = A[i-1] + A[i/2]我实在是想不出来,不知道大佬们是怎么想到的,orz

课程设计报告:总体方案设计说明 一、软件开发环境配 本系统采用C++作为核心编程语言,结合Qt 5.12.7框架进行图形用户界面开发。据库管理系统选用MySQL,用于存储用户据与小精灵信息。集成开发环境为Qt Creator,操作系统平台为Windows 10。 二、窗口界面架构设计 系统界面由多个功能模块构成,各模块职责明确,具体如下: 1. 起始界面模块(Widget) 作为应用程序的入口界面,提供初始导航功能。 2. 身份验证模块(Login) 负责处理用户登录与账户注册流程,实现身份认证机制。 3. 游戏主大厅模块(Lobby) 作为用户登录后的核心交互区域,集成各项功能入口。 4. 资源管理模块(BagWidget) 展示用户持有的全部小精灵资产,提供可视化资源管理界面。 5. 精灵详情模块(SpiritInfo) 呈现选定小精灵的完整属性据与状态信息。 6. 用户名录模块(UserList) 系统内所有注册用户的基本信息列表展示界面。 7. 个人资料模块(UserInfo) 显示当前用户的详细账户资料与历史据统计。 8. 服务器精灵选择模块(Choose) 对战准备阶段,从服务器可用精灵池中选取参战单位的专用界面。 9. 玩家精灵选择模块(Choose2) 对战准备阶段,从玩家自有精灵库中筛选参战单位的操作界面。 10. 对战演算模块(FightWidget) 实时模拟精灵对战过程,动态呈现战斗动画与状态变化。 11. 对战结算模块(ResultWidget) 对战结束后,系统生成并展示战斗结果报告与据统计。 各模块通过统一的事件驱动机制实现据通信与状态同步,确保系统功能的连贯性与据一致性。界面布局遵循模块化设计原则,采用响应式视觉方案适配不同显示环境。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值