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;
}
完结撒花 \(\^_^/\)
