Fudan 2020年夏令营编程摸底 练习

本文介绍了Fudan2020年夏令营编程摸底题目,包括前置课程的拓扑排序算法,最大正方子矩阵的动态规划解法,以及涉及的编程库和数据读取。在前置课程问题中,使用BFS解决有向图的课程顺序;最大正方子矩阵问题通过动态规划寻找矩阵中最大全1子矩阵的边长。同时,文章还提及了一种可能的染色与查询树问题,并简述了相关库的导入和数据读取操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目转载:感谢大大分享的原题目,感觉是真题

题目1:前置课程

给小菜鸡本人吓傻了!!!

代码及注释

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

//BFS广度优先算法
class Solution {
private:
	// 存储有向图
	vector<vector<int>> edges;
	// 存储每个节点的入度
	vector<int> indeg;
	// 存储答案
	vector<int> result;

public:
	vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
		edges.resize(numCourses);//resize——vector特有函数表示edges的大小为numCourses
		indeg.resize(numCourses);
		//for循环活久见,表示prerequisites(双vector)类型从头跑到尾,后面同理
		for (const auto& info : prerequisites) {
			edges[info[1]].push_back(info[0]);
			++indeg[info[0]];
		}

		queue<int> q;
		// 将所有入度为 0 的节点放入队列中
		for (int i = 0; i < numCourses; ++i) {
			if (indeg[i] == 0) {
				q.push(i);
			}
		}

		while (!q.empty()) {
			// 从队首取出一个节点
			int u = q.front();
			q.pop();
			// 放入答案中
			result.push_back(u);
			for (int v : edges[u]) {
				--indeg[v];
				// 如果相邻节点 v 的入度为 0,就可以选 v 对应的课程了
				if (indeg[v] == 0) {
					q.push(v);
				}
			}
		}

		if (result.size() != numCourses) {
			return {};
		}
		return result;
	}
};

//自己瞎写的测试用例,输出正确的0,1,2,3 但是另一种输不出来0,2,1,3
int main() {
	Solution t;
	vector<int>a = { 1,0 };
	vector<int>b = { 2,0 };
	vector<int>c = { 3,1 };
	vector<int>d = { 3,2 };
	vector<vector <int>>K = {a, b, c, d};
	vector<int>res=t.findOrder(4, K);
	vector<int>::iterator it = res.begin();
	for (int i = 0; i < 3;i++) {
		printf("%d,", *it);
		it++;
	}
	printf("%d", *it);
	return 0;
}

题目2:最大正方子矩阵

太难了。。。我吐了
代码及注释
1、max min对应的库为algorithm
2、vector< vector > v(m, vector(n) );是什么意思 
定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。

#include <iostream>
#include<vector>
#include<algorithm>
//#include <sstream>
//#include <string>
using namespace std;

//void input_vector(vector<vector<int>>&);


class Solution {
public:
	int maximalSquare(vector<vector<int>>& matrix) {//char型??

		int m = matrix.size();//行数
		if (m == 0) return 0;               //排除空矩阵
		int n = matrix[0].size();//列数

		int val1, val2, val3;
		vector<vector<int> > dp(m, vector<int>(n, 0));//构建一个元素都是0的m*n矩阵dp_辅助数组
		int maxlen = 0;
		//左边界
		for (int i = 0; i < m; ++i)
		{
			dp[i][0] = matrix[i][0] ;//matrix是char型的??
			if (dp[i][0] == 1) maxlen = 1;
		}
		//上边界
		for (int j = 0; j < n; ++j)
		{
			dp[0][j] = matrix[0][j];
			if (dp[0][j] == 1) maxlen = 1;
		}
		for (int i = 1; i < m; ++i)
		{
			for (int j = 1; j < n; ++j)
			{
				if (matrix[i][j] == 0) continue;//本身是0,跳出本次循环
				val1 = dp[i - 1][j - 1];//左上
				val2 = dp[i - 1][j];//左
				val3 = dp[i][j - 1];//上
				dp[i][j] = min(val1, min(val2, val3)) + 1;//本身是1,要+1
				maxlen = max(maxlen, dp[i][j]);
			}
		}
		return maxlen;
	}
};

/*void input_vector(vector<vector<int> >& vec)
{
	vector<int> v;
	while (!cin.eof()) {
		int tmp(0);
		v.clear();
		string line;
		getline(cin, line);
		istringstream ss(line);
		while (ss >> tmp) {
			v.push_back(tmp);
		}
		vec.push_back(v);
	}
}*/

int main()
{
	//vector<vector<int>> vec;
	//input_vector(vec);
	Solution t;
	vector<int>a = { 1,1,1,1,1 };
	vector<int>b = { 1,1,1,1,1 };
	vector<int>c = { 1,1,1,1,1 };
	vector<int>d = { 1,0,0,1,0 };
	vector<vector<int>>vec= {a, b, c, d};
	int ans=t.maximalSquare(vec);
	cout << ans;
	//vector<vector<int>>::iterator it = vec.begin();
	/*for (; it != vec.end(); ++it) {
		vector<int>::iterator i = it->begin();
		while (i != it->end()) {
			cout << *i++ << " ";
		}
		cout << endl;
	}*/
	return 0;
}

【注释掉的部分代码为输入不确定大小的矩阵,不知道为什么vector会越界,恼火】

题目3:染色与查询 树

3.1
3.2

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

(未完待续)

难过,怎么会这么难,感觉自己代码能力太弱了。
祝福自己今年夏令营顺利,及时摸底都能在网上查到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值