栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

好题分析--洛谷P1044 [NOIP2003 普及组] 栈

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

好题分析--洛谷P1044 [NOIP2003 普及组] 栈

#include
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< 

这里主要分析可行性,即为什么f[x][y]会等于这几个值累加?推究其原,其实是由于这n个数是各不相同的,因此我们只要分析队列中剩x,栈中剩y的情况,肯定是在由其他所有情况的基础上才能推出的,by the way,点睛之笔就是  if(f[x][y]!=0) return f[x][y],使得已经得出来的结果不用再重复计算。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/304285.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号