[C言語]レベル11053:成長が最も長い部分数列
構想
LISが何なのかわからず検索してみました
https://rebro.kr/33
LISは符号化テストでよく見られるタイプで,解読方法は大きく2種類ある.これはDPとこの探索です.まず,DPはn値の増大に伴って非常に時間がかかる方法であり,二分探索は時間をうまく節約でき,最終的に二分探索を用いることを説明する.
こちらの検索も検索しましたが、なかなか難しく、DPで解決することにしました.
エラーの回答
#include <stdio.h>
int main()
{
int n;
int dp[1001] = {0, };
int input[1001] = {0, };
int max = 0;
scanf("%d", &n); // 4로 가정
for (int i = 0; i < n; i++)
{
scanf("%d", &input[i]); // 10 20 30 15 으로 가정,
if (dp[i] == 0)
dp[i] = 1; // 기본값 1 넣어줌
for (int j = 0; j < i; j++)
{
if (input[i] > input[j]) // i = 1일때로 예를 들면, 20은 10보다 크므로 if에 걸림
{
if (dp[i] < dp[j] + 1) // dp[1] = 1, dp[0] + 1 = 2이므로 if에 걸림
{
dp[i] = dp[j] + 1; // dp[1] = 2
if (max < dp[i]) // 우리는 최대 길이를 구하기에 max를 구해야함. dp[i]가 max보다 클 경우
max = dp[i]; // max에 dp[i]를 저장, 계속 반복
}
}
}
}
printf("%d", max); // max출력
}
修正の解答
#include <stdio.h>
int main()
{
int n;
int dp[1001] = {0, };
int input[1001] = {0, };
int max = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &input[i]);
for (int j = 0; j < i; j++)
{
if (input[i] > input[j])
{
if (dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1;
if (max < dp[i])
max = dp[i];
}
}
}
}
printf("%d", max);
}
間違った解答と修正した解答の違いは文i=1である.i<= n; i++に変えて、
if (dp[i] == 0)
dp[i] = 1;//既定のスケール1
この部分を直接削除して通過した.今でもなぜ通過したのか分からない.
明日LISに解かせても说明しながら解けるかどうか分からない
まずフィードバック問題掲示板に置いて、返信があればフィードバックしてから修正すべきです.
次の問題はGold 3で、LISを運用する問題です.今は難しそうです.この間はほかのことを勉強しましょう.
https://rujang.tistory.com/entry/%EB%B0%B1%EC%A4%80-11053%EB%B2%88-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4-CC
https://henrynoh.tistory.com/32
Reference
この問題について([C言語]レベル11053:成長が最も長い部分数列), 我々は、より多くの情報をここで見つけました https://velog.io/@kimmainsain/C언어-백준-11053-가장-긴-증가하는-부분-수열テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol