[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