1 条题解

  • -4
    @ 2025-2-22 21:48:03

    beyond 这题想了3个小时,才有所感悟

    • 当a[i] != b[j] 时,f[i][j] = f[i-1][j]。
    • 当 a[i] == b[j] 时,f[i][j] = max(f[i-1][k] + 1),其中 1 <= k < j 且 b[k] < b[j]。
    • 此代码亦可优化
    • 我们可以像优化0/1背包问题利用滚动数组来优化空间。
    • 原因是每次用到的只是上一层循环用到的值,即f[i-1][j]
    • 但不想在改了
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int N = 2001;
    int a[N], b[N], f[N][N];
    
    int LCIS(int n, int m) 
    {
    	int ans = 0;
    	for (int i = 0; i < n; ++i) 
    	{
    		int maxv = 0;
    	for (int j = 0; j < m; ++j) 
    	{
    		f[i+1][j+1] = f[i][j+1];
    		if (a[i] == b[j]) 
    	{
    		for (int k = 0; k < j; ++k) 
    	{
    		if (b[j] > b[k]) 
    		{
    			maxv = max(maxv, f[i][k+1]);
    		}
    	}
    		f[i+1][j+1] = maxv + 1;
    }
    	ans = max(ans, f[i+1][j+1]);
    	}
    	}
    		return ans;
    }
    
    int main() {
    	freopen("lcis.in","r",stdin); 
    	freopen("lcis.out","w",stdout);
    	int n;
    	cin >> n;
    	for (int i = 0; i < n; ++i) 
    	cin >> a[i];
    	for (int i = 0; i < n; ++i) 
    	cin >> b[i];
    	cout << LCIS(n, n) << endl;
    	return 0;
    }
    
    
    • 1

    信息

    ID
    551
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    152
    已通过
    10
    上传者