牛客网 牛牛数括号(DP)

题目连接
题意

题干已经说的很清楚
给你两个括号序列,不保证合法,求有多少种不同的方法可以将两个括号序列合并成一个合法的括号序列
合并的时候不能改变各自序列原先的顺序

思路

dp[i][j] 表示s1串前i个和s2串前j个,左括号大于等于右括号,还有机会变成合法括号序的方案数。
pre[i][j] 左括号表示+1右括号-1,s1和s2的前缀和。

最后检查一下是否pre[len1][len2] 为0即可,0表示合法。
滚动数组优化空间否则会MLE

代码
#include <bits/stdc++.h>
using namespace std;

char s1[2505], s2[2505];
int dp[2][2505], pre[2][2505], mod = 1e9+7;

int main()
{
    scanf("%s%s",s1+1,s2+1);
    int len1 = strlen(s1+1), len2 = strlen(s2+1), cur = 0;
    dp[cur][0] = 1;
    for(int i = 0; i <= len1; ++i)
    {
        if(i) cur ^= 1;
        if(i) memset(dp[cur], 0, sizeof(dp[cur]));
        for(int j = 0; j <= len2; ++j)
        {
            if(i == 0 && j == 0) continue;
            if(j) pre[cur][j] = pre[cur][j-1] + (s2[j] == '(' ? 1 : -1);
            else pre[cur][j] = pre[cur^1][j] + (s1[i] == '(' ? 1 : -1);

            if(pre[cur][j] < 0) continue;
            if(i) dp[cur][j] += dp[cur^1][j];
            if(j) dp[cur][j] += dp[cur][j-1];
            dp[cur][j] %= mod;
        }
    }
    if(pre[cur][len2] == 0) printf("%d\n",dp[cur][len2]);
    else printf("0\n");
    return 0;
}
<think>嗯,用户让我预测2025年内蒙古大学计算机研究生复试笔试的编程题目。首先,我需要分析用户的需求。用户可能是准备考研的学生,希望提前了解可能的考试内容,以便有针对性地复习。不过,预测具体题目存在不确定性,我需要确保回答既实用又不误导。 接下来,我需要考虑内蒙古大学计算机专业的教学重点。通常,复试编程题可能涉及基础算法、据结构、编程思维等。比如排序、查找、递归、动态规划这些常见考点。此外,可能结合实际问题,考察学生的应用能力。 用户可能期望得到具体的题目例子或题型,但直接预测具体题目不现实,也不符合学术规范。因此,我应该转而提供常见的题型和复习建议,帮助用户系统准备。同时,提醒他们关注历年真题和课程大纲,这样更可靠。 还要注意回答的结构,确保清晰,分点列出可能的考点和复习策略。避免使用Markdown,保持自然的口语化表达,但又要专业。需要强调无法保证准确性,但提供合理的备考方向。 最后,检查是否遵守了系统级指令:学公式用$...$,中文回答,结构清晰。确认没有使用任何格式,语言自然,符合用户要求。</think>关于2025年内蒙古大学计算机研究生复试编程题预测,需要明确说明:由于试题属于保密内容且命题具有随机性,任何个人无法提供确切预测。但可以基于计算机专业培养目标和近年趋势,给出合理的备考建议: **一、常见考察方向** 1. **基础算法** - 排序算法实现(如快速排序$O(n\log n)$、归并排序) - 查找算法(二分查找的时间复杂度$O(\log n)$) - 递归应用(斐波那契列、汉诺塔问题) 2. **据结构应用** - 链表操作(反转/合并链表) - 树结构遍历(二叉树先序/中序/后序遍历) - 栈与队列应用(括号匹配、表达式求值) 3. **动态规划** - 经典问题(背包问题、最长公共子序列) - 状态转移方程设计(如爬楼梯问题$f(n)=f(n-1)+f(n-2)$) **二、典型题型示例** ```python # 示例1:字符串处理 def palindrome(s: str) -> bool: return s == s[::-1] # 示例2:动态规划-最大子序和 def max_subarray(nums): dp = [0]*len(nums) dp[0] = nums[0] for i in range(1,len(nums)): dp[i] = max(nums[i], dp[i-1]+nums[i]) return max(dp) ``` **三、备考建议** 1. **夯实基础** - 重点掌握《据结构与算法》教材中的经典案例 - 熟练使用Python/C++实现基本算法结构 2. **实战训练** - 在LeetCode/牛客网练习简单-中等难度题目 - 特别注意时间/空间复杂度分析(如递归优化为迭代) 3. **拓展思维** - 了解常见算法优化方法(如记忆化搜索) - 学习模块化编程思想(函拆分、边界条件处理) **四、注意事项** - 近年可能增加对实际工程问题的抽象能力考察(如简单系统设计) - 部分题目会要求写出时间/空间复杂度表达式(如$T(n)=2T(n/2)+O(n)$) - 注意代码规范(变量命名、注释清晰度) 建议密切关注学校官网公布的复试大纲(如有),并结合历年真题进行针对性训练。编程能力提升需要长期积累,重点在于培养解决问题的系统性思维而非押题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值