栈(洛谷p1044)c++实现

题目链接·P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题的第一个难点在于读懂题,,,他巴拉巴拉了一大堆,我硬是看了好几遍才看懂,实际的意思就是有一个栈(单方向进和单方向出的,大家应该知道吧,不知道的话可以看一下站内大佬的讲解,非常重要也是基础的一种数据结构),然后将n个不同的小球按顺序放入栈,在小球放入的过程中也可以把栈顶的一个或多个球有顺序的拿出来,大概意思就是这样。。。

然后第二个难点是,如果想计算器编的简单,那你就得想的复杂,这边语言不好描述,我直接把书搬过来(应该不能算违权吧,我的博客这么小众)

举个例子:例如一共有5个数字,那么1的出栈顺序就有可能会有5种,那么假设在第一处1就最先出栈了,那他就等于1前面出栈的方法数乘上1后面出栈的方法数,同理递推,书上就是帮你找到公式,然后代码非常简短

#include<iostream>
using namespace std;
int main()
{
	int n;
	int a[20] = { 1,1 };
	cin >> n;
	for (int i = 2; i <= n; i++) {
		for (int j = 0; j < i; j++) {
			a[i] += a[j] * a[i - j - 1];
		}
	}
	cout << a[n];
	return 0;
}

好,这道题就这样非常简单的过去了,但其实我认为这种方法一般人想不到,于是就去题解区又抄了一个应该比上面好想点的方法,先上代码:

#include<iostream>
using namespace std;
long n,f[20][20];//f数组记录方案
long dfs(int x,int y)//x是操作队列里元素的个数,y是栈里的个数
{
    if(f[x][y]!=0) return f[x][y];//记忆化,走过的方案直接调用
    if(x==0) return 1;//当操作队列里没有了,就只有一种方案了
    if(y>0) f[x][y]+=dfs(x,y-1);//栈里不为空的时候才可以把栈里的元素推出
    f[x][y]+=dfs(x-1,y+1);//操作队列里元素减一,栈里元素加一
    return f[x][y];//返回方案值
}
int main()
{
    cin>>n;
    cout<<dfs(n,0)<<endl;
    return 0;
}

这个代码的思路就是记忆化搜索,不清楚的同学可以看一下这篇博客:

算法数据结构——记忆化搜索(Memoization Search)算法超详细总结加应用案例讲解-CSDN博客

站内大佬写的,不是我。

这个其实也是化繁为简,和汉诺塔的原理差不多,注释应该也比较清楚,如果有不懂的欢迎在评论区提问捏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值