关于最长上升子序列(LIS)

见dp方法看下文↓

dp方法

LIS已经有很多dalao讲过了,而我这个蒟蒻愣是连方程都没推出来(我好菜)


于是乎,我就用个记忆化来写。

思路

既然是搜索,那么就先找条件。
本题的条件是 \(a_{1} < a_{2} < …… < a_{n}\)
那么便可写出

if(a[i] < a[n]) 
	ans = max(ans, dfs(i) + 1);

好了,说记忆化。

记忆化

记忆化就是把之前算过的东西存起来,要用的时候再拿出来。
只要加上这两行:

if(dp[n] > 1) return dp[n];
//其他东西
return dp[n] = ans;

代码

#include<bits/stdc++.h>
using namespace std;
int dp[210];
int out = 0, a[210];
int dfs(int n){
    int ans = 0;
    if(dp[n] > 1) return dp[n];
    for(int i = 1; i < n; i++)
        if(a[i] < a[n]) ans = max(ans, dfs(i) + 1);
    out = max(ans, out);
    return dp[n] = ans;
}
int main(){
    int i = 1;
    while(cin >> a[i]) i++;
    for(int j = 1; j <= i; j++) dfs(j), dp[j] = 1;
    cout << "max=" << out + 1;
}

完结撒花 \(\^_^/\)

posted @ 2026-05-16 21:46  小汪同学^_^  阅读(13)  评论(0)    收藏  举报