RC-u5 栈与数组

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1001;

int n, m, k;
int dp[N][N]; //整个操作过程中数组最大容量的最小值
int pre[N][N]; //在删除k个相同数的条件下将1 ~ i, 1 ~ j里的数字放进数组后的长度

void solve()
{
    cin >> n >> m >> k;
    vector<int> a(n + 1), b(m + 1);
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    for(int i = 1; i <= m; i ++ ) cin >> b[i];

    //预处理pre数组
    map<int, int> mp;
    int cap = 0;
    for(int i = 0; i <= n; i ++ )
    {   
        mp.clear();
        cap = 0;
        for(int j = 1; j <= i; j ++ )
        {
            cap ++;
            if(++ mp[a[j]] == k) mp[a[j]] = 0, cap -= k;
        }
        for(int j = 0; j <= m; j ++ )
        {
            if(j)
            {
                cap ++;
                if(++ mp[b[j]] == k) mp[b[j]] = 0, cap -= k;
            }
            pre[i][j] = cap;
        }
    }

    //初始化
    memset(dp, 0, sizeof dp);
    for(int i = 1; i <= n; i ++ ) 
    {
        dp[i][0] = max(pre[i - 1][0] + 1, dp[i - 1][0]);
    }
    for(int i = 1; i <= m; i ++ )
    {
        dp[0][i] = max(pre[0][i - 1] + 1, dp[0][i - 1]);
    }

    //状态转移
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= m; j ++ )
        {
            int ans1 = max(pre[i - 1][j] + 1, dp[i - 1][j]);
            int ans2 = max(pre[i][j - 1] + 1, dp[i][j - 1]);
            dp[i][j] = min(ans1, ans2);
        }
    cout << dp[n][m] << endl;
}

signed main()
{
    int t;
    cin >> t;
    while(t --) solve();
    return 0;
}

04-01
### 关于 RC-U5 技术文档或开发者指南的信息 RC-U5 是 2022 RoboCom 世界机器人开发者大赛中的一个重要主题,涉及树结构二分图的相关算法设计和实现。以下是关于该主题的技术信息汇总: #### 1. **RC-U5 的核心概念** RC-U5 主要围绕无向图的性质展开,特别是二分图的概念及其判定方法。根据定义,一个无向图 \(G = (V, E)\) 被称为二分图当且仅当其顶点集合可以划分为两个互不相交的子集 \((A, B)\),使得每条边的两端分别位于不同的子集中[^3]。 #### 2. **技术实现的关键点** 在竞赛中,通常需要通过编程来验证给定图是否为二分图。常见的做法是利用广度优先搜索(BFS)或深度优先搜索(DFS),并尝试对节点进行双色染色。如果能够成功完成染色而不出冲突,则说明该图为二分图;否则不是。 以下是一个基于 BFS 实现的 Python 示例代码用于判断二分图: ```python from collections import deque def is_bipartite(graph): n = len(graph) color = [-1] * n # 初始化颜色数组-1 表示未着色 for start in range(n): # 遍历所有可能的连通分量 if color[start] != -1: # 已经访问过的节点跳过 continue queue = deque([start]) color[start] = 0 # 初始节点设置为颜色 0 while queue: node = queue.popleft() current_color = color[node] next_color = 1 - current_color for neighbor in graph[node]: if color[neighbor] == -1: # 如果邻居尚未着色 color[neighbor] = next_color queue.append(neighbor) elif color[neighbor] == current_color: # 发生颜色冲突 return False return True ``` 此代码片段展示了如何使用队列数据结构执行 BFS 并检测是否存在矛盾的颜色分配情况[^4]。 #### 3. **开发过程中需要注意的地方** 参赛选手提到,在实际编码阶段可能会因为变量类型的选取不当而导致错误。例如,默认采用整型存储某些计算结果可能导致溢出问题,因此建议显式声明更宽泛的数据类型如 `long long` 来规避此类风险[^5]。 #### 4. **其他相关资源链接** 除了上述理论基础外,还可以参考 JavaScript 中有关文件处理的知识补充理解 Base64 编码的应用场景以及其他格式间的转换逻辑[^2]。虽然这部分内容看似偏离主题较远,但在现代软件工程实践中了解多种数据表示形式总是有益处的。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值