C++ 洛谷P1739 表达式括号匹配(史上最详细题解)

同志们好!

挖掘机技术哪家强?

当然是洒家强!

广告结束。


今天给大家带来的题目是:洛谷P1739 表达式括号匹配

目录:

1.题目到底是啥?

2.史上最详细题解!

3.代码举例!


题目到底是啥?

P1739 表达式括号匹配

题目描述

假设一个表达式有英文字母(小写)、运算符(+-*/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255,左圆括号少于 20个。

输入格式

一行:表达式。

输出格式

一行:YES 或 NO

输入输出样例

输入 #1

2*(x+y)/(1-x)@

输出 #1

YES

输入 #2

(25+x)*(a*(a+b+b)@

输出 #2

NO

说明/提示

表达式长度小于 255,左圆括号少于 20 个。

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


史上最详细题解!

P1739 表达式括号匹配难度系数:AAA

其实这道题看起来很复杂,关键是被列到了栈的内容里

但是听洒家一讲,准能明白!

吹牛到此为止。

这道题问题是怎么知道它左右括号的数量(数量一样也就匹配上了

左括号的ASCLL码是:40,右括号的ASCLL是:41

其实直接'('和')' 就行了

所以,核心句型就一点:

if(ch==')')
	if(top>0)
		top--;
	else
	{
		cout<<"NO";
		return 0; 
	}

所以,就补充完呗:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int top;
int main()
{
	char ch;
	while(ch!='@')
	{
		scanf("%c",&ch);
		if(ch=='(')
			top++;
		if(ch==')')
			if(top>0)
				top--;
			else
			{
				cout<<"NO";
				return 0; 
			}
	}
	if(top==0)
		printf("YES");
	else
		printf("NO");
}

就那么简单好吧


代码举例!

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int top;
int main()
{
	char ch;
	while(ch!='@')
	{
		scanf("%c",&ch);
		if(ch=='(')
			top++;
		if(ch==')')
			if(top>0)
				top--;
			else
			{
				cout<<"NO";
				return 0; 
			}
	}
	if(top==0)
		printf("YES");
	else
		printf("NO");
}

点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 点赞关注收藏 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
过河卒是一个典型的动态规划问题。首先,我们将整个棋盘看作一个二维数组,数组的每个元素表示到达该位置的路径数目。然后,我们根据题目给出的条件,逐步更新数组中的元素,直到计算出到达目标位置的路径数目。 具体的解题思路如下: 1. 首先,我们可以将马的位置设置为0,表示无法经过该位置。 2. 然后,我们根据马的位置,更新数组中的元素。对于二维数组中的每个位置,我们根据左边和上边的位置来计算到达当前位置的路径数目。具体地,如果左边和上边的位置都可以经过,那么到达当前位置的路径数目就等于左边和上边位置的路径数目之和。如果左边或上边的位置无法经过,那么到达当前位置的路径数目就等于左边或上边位置的路径数目。 3. 最后,我们输出目标位置的路径数目。 下面是p1002过河卒题解的C++代码: ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long a[21][21]; int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; // 初始化数组,马的位置设置为0 for(int i=0; i<=20; i++) { for(int k=0; k<=20; k++) { a[i][k] = 1; } } a[x2][y2] = 0; // 根据马的位置更新数组中的元素 if(x2 >= 2 && y2 >= 1) a[x2-2][y2-1] = 0; if(x2 >= 1 && y2 >= 2) a[x2-1][y2-2] = 0; if(x2 <= 18 && y2 >= 1) a[x2+2][y2-1] = 0; if(x2 <= 19 && y2 >= 2) a[x2+1][y2-2] = 0; if(x2 >= 2) a[x2-2][y2+1] = 0; if(x2 >= 1) a[x2-1][y2+2] = 0; if(y2 >= 1) a[x2+2][y2-1] = 0; if(y2 >= 2) a[x2+1][y2-2] = 0; // 动态规划计算路径数目 for(int i=1; i<=20; i++) { for(int k=1; k<=20; k++) { if(a[i][k] != 0) { a[i][k] = a[i-1][k] + a[i][k-1]; } } } // 输出目标位置的路径数目 cout << a[x1][y1] << endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值