请问能否讲述一下这段代码的时间复杂度如何判断以及如何优化?
查看原帖
请问能否讲述一下这段代码的时间复杂度如何判断以及如何优化?
119537
mirayan楼主2021/5/29 22:00

rt,初学dp,很多地方弄不太懂

大体的思路是用一个数组表示第一个数组中第i个元素在第二个数组中的位置,然后寻找这个数组的最大上升子序列

最后得了50分,有5个tle

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



int a[100010] = {0}, b[100010] = {0}, c[100010] = {0},surch[100010] = {0};

int link[100010] = {1};

void dp(int x, int y) {
	for (int i = x + 1; i <= y; i++) {

		if (surch[x] < surch[i]) {
			if (link[x] + 1 > link[i]) {
				link[i] = link[x] + 1;
				dp(i, y);
			}
		}
	}
}

int main() {
	int n;
	cin >> n;

	for (int i = 1; i <= n; i++) {

		cin >> a[i] ;
	}

	for (int i = 1; i <= n; i++) {

		cin >> b[i] ;
		c[b[i]] = i;

	}


	for (int i = 1; i <= n; i++) {

		surch[i] = c[a[i]];
	}

	for (int i = 1; i <= n; i++) {

		link[i] = 1;
	}

	for (int i = 1; i <= n; i++) {

		if (link[i] == 1) {
			dp(i, n);
		}

	}

	int max = link[0];

	for (int i = 1; i <= n; i++) {

		if (link[i] > max)
			max = link[i];
	}

	cout << max;

}
2021/5/29 22:00
加载中...