白駿11053.最長のローカル数列−問題解(c++)(dp)
2111 ワード
🔎 11053.問題を見る
https://www.acmicpc.net/problem/11053
💡 問題を解く前に
📝 コードの表示
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1111111];
int cache[1111111];
int solve(int start) {
int &ret=cache[start+1];
if(ret!=-1) return ret;
ret=0; // *중요*
for(int i=start+1; i<n; i++) {
if(start==-1 || a[start]<a[i]) {
ret = max(ret, solve(i)+1);
}
}
return ret;
}
int main() {
cin >> n;
for(int i=0; i<n; i++) {
cin >> a[i];
}
memset(cache, -1, sizeof(cache));
cout << solve(-1) << "\n";
for(int i=0; i<=n; i++) {
cout << cache[i] << " ";
}
return 0;
}
🎈 コード解釈と関連概念
時間複雑度O(n^2)
例えば、4つの数字がある場合、
-1からstartが3になるまで,解(i)を繰り返す.
各解(i)はi
ここで、solve(0)は、solve(0)が1回で終わるのではなく、for文solve(0)->solve(1)->solve(2)->solve(3)iがnの前にも実行される.
Reference
この問題について(白駿11053.最長のローカル数列−問題解(c++)(dp)), 我々は、より多くの情報をここで見つけました https://velog.io/@minseojo/백준-11053.-가장-긴-증가하는-부분-수열-문제풀이-c-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol