洛谷P1044栈(DP)
题目背景
栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。
栈有两种最重要的操作,即poppoppop(从栈顶弹出一个元素)和pushpushpush(将一个元素进栈)。
栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。
题目描述

宁宁考虑的是这样一个问题:一个操作数序列,1,2,...,n1,2,...,n1,2,...,n(图示为1到3的情况),栈AAA的深度大于nnn。
现在可以进行两种操作,
将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的pushpushpush操作)
将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的poppoppop操作)
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由1231 2 3123生成序列2312 3 1231的过程。

(原始状态如上图所示)
你的程序将对给定的nnn,计算并输出由操作数序列1,2,…,n1,2,…,n1,2,…,n经过操作可能得到的输出序列的总数。
输入格式
输入文件只含一个整数n(1≤n≤18)n(1≤n≤18)n(1≤n≤18)
输出格式
输出文件只有111行,即可能输出序列的总数目
输入输出样例
3
5
这题实际上是卡特兰数,既然标签是DP就考虑DP解法。设dp[i][j]表示i个数还没入栈,j个数在栈里,n-i-j个数已经出栈的最大方案数,则转移方程可以写出:dp[i][j]=dp[i-1][j+1]+dp[i][j-1]。要么选择把一个数入栈,要么选择一个数出栈。注意当j=0时即栈内没有数,这时候只能选择把一个数入栈。然后看边界,当i=0时,所有数要么在栈内要么已经出栈,这时候只有一种情况,所以赋值为1。要求的是dp[n][0]
所以i从1~n,j从0~n-i进行更新。可以看出,这个题是从结果(出栈序列已知的方案数)向初始情况更新。
#include <bits/stdc++.h>
using namespace std;
int dp[][]={};//dp[i][j]表示i个数还没入栈,j个数在栈里,n-i-j个数已经出栈的最大方案数 dp[i][j]=dp[i-1][j+1]+dp[i][j-1] //dp[0][j]=1 所有数都在栈里 只有一种方式
int main()
{
int n;
cin>>n;
int i,j;
dp[][]=;
for(j=;j<=n;j++)dp[][j]=;
for(i=;i<=n;i++)//注意是从1开始
{
for(j=;j<=n-i;j++)
{
if(j!=)dp[i][j]=dp[i-][j+]+dp[i][j-];
else dp[i][j]=dp[i-][j+];
}
}
cout<<dp[n][];
return ;
}
洛谷P1044栈(DP)的更多相关文章
- 洛谷P1044 栈(Catalan数)
P1044 栈 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要 ...
- 洛谷——P1044 栈
P1044 栈——卡特兰数 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈) ...
- 洛谷 - P1044 - 栈 - 简单dp
https://www.luogu.org/problemnew/show/P1044 由于是用标签搜索进来的,所以这道题一定是有dp的解法. 很显然规定每次加入元素之前可以从栈中清理出任意数量的元素 ...
- 洛谷P1044 栈
之前看这题还是一头雾水,现在看:啊啊啊lydnb! 思考了一段时间,发现可以用DP. 令f[i]表示有i辆车时的方案数. 我一开始考虑的是在后面加车,可是这样搞不出状态转移方程来. 然后我考虑从前面加 ...
- 洛谷 p1044 栈 【Catalan(卡特兰数)】【经典题】
题目链接:https://www.luogu.org/problemnew/show/P1044 转载于:https://www.luogu.org/blog/QiXingZhi/solution-p ...
- 洛谷 P1044 栈
题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何 ...
- 洛谷教主花园dp
洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价 ...
- 洛谷 p6858 深海少女与胖头鱼 洛谷月赛 期望dp
洛谷10月月赛 2 t2 深海少女与胖头鱼 题目链接 参考资料:洛谷10月赛2讲评ppt; 本篇题解考完那天就开始写,断断续续写到今天才写完 本题作为基础的期望dp题,用来学习期望dp还是很不错的 ( ...
- AC日记——栈 洛谷 P1044
题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要性不言自明,任何 ...
随机推荐
- Python中matplotlib模块的简单使用
测试代码如下: # encoding:utf-8 import numpy as np import matplotlib.pyplot as plt x = np.array([1,2,3,4,5, ...
- [AtCoder Code Festival 2017 QualB C/At3574] 3 Steps - 二分图染色,结论
给你一个n个点m条边的无向图,进行以下操作 如果存在两个点u和v,使得从u走三步能恰好到达v,那么在u和v之间连接一条边 重复这个操作直到不能再连接新的边,问最后有多少条边? n, m <= 1 ...
- 用MyEclipse远程debug
第一步 编辑 tomcat下的文件startup.sh文件,我的路径是 /root/apache-tomcat-6.0.24/bin/startup.sh 命令:vim startup.sh将decl ...
- 你所不知道的locust
from locust import HttpLocust, TaskSet, task import uuid, time import logging,json # https://docs.lo ...
- macOS系统下安装ChromeDriver
1.对应的chrome浏览器需要安装对应的驱动,对应列表如下: chromedriver版本 支持的chrome版本 v2.43 v69-71 v2.42 v68-70 v2.41 v ...
- 录入规则文件名到CSV文件
import os import sys import csv # 导出到csv文件 def export_to_csv(datas): with open('export.csv', 'w', ne ...
- 搭建GithubPages静态博客踩过的坑
前言 搭建了属于自己的GitHub Page作为个人博客,上手Hexo+Material感觉比较花哨,后改用Yilia主题效果良好.期间发现并解决了一些问题,贴出值得记录的部分作为参考: 维护 书写 ...
- HTML /和./的区别 - Web开发
"/"访问根目录 例1 https://www.cnblogs.com/test 里有 <a href="/Edsuns"></a> 则 ...
- sql server和my sql 命令(语句)的区别,sql server与mysql的比较
sql与mysql的比较 1.连接字符串sql :Initial Catalog(database)=x; --数据库名称 Data Source(source)=x; - ...
- jenkins 集成环境搭建
http://www.cnblogs.com/jenniferhuang/p/3355252.html