학습 노트
학습 노트
요 며칠 DP 문제를 몇 개 보았으니 이제 작은 총결산을 합시다.저는 개인적으로 dp를 처음 배울 때 이 세 가지 고전적인 DP 문제를 먼저 알아야 한다고 생각합니다.그럼 이 세 가지 간단하지만 확실한 경전의 dp를 간단하게 설명해 드리겠습니다.
1. 국부 최대 및:
대체적으로 제목의 뜻은 이렇다. 일련의 숫자 a[n]에서 연속적인 숫자를 찾아내 그들의 것과 가장 큰 숫자를 만든다.이거 제일 큰 거랑 max 주세요.
가령 현재 a[i]로 끝날 때의 최대치sum[i]가 나왔다고 가정한다.그러면sum[i+1]에 대해 두 가지 상태가 있는데 첫 번째는 이전의sum[i]<0시,sum[i+1]=a[i+1];두 번째는sum[i]>=0일 때sum[i+1]=sum[i]+a[i+1];
그래서 얻은 동적 이동 방정식은 다음과 같다.if(sum[i]<0)
sum[i+1]=a[i+1];
else
sum[i+1]=sum[i]+a[i+1];
모든sum를 구한 후에 한 번만 훑어보면 가장 큰sum[i], 즉max를 구하는 것이 요구된다.물론 하나의 변수sum를 직접 사용하여 단계별로 판단하고 값을 부여할 수 있으며 max를 구할 수 있다.(어떤 문제에서는 약간의 변형이 있을 수 있다. 예를 들어 항저우전기에 문제가 있는데 어떤 문제인지 잊어버렸다. 그는 너에게 max를 구할 뿐만 아니라 이 문자열의 위치도 찾아내라고 요구했다. ps: 두 개의 표시를 달면 된다)
2. 가장 긴 공통 서열을 구한다.
대체적으로 두 문자열 중에서 이 두 문자열의 가장 긴 공통 서열의 길이를 구하는 것이다.(이 문자열은 반드시 연속된 것은 아니다)
두 문자열을 a[n], b[n]로 설정합니다.그리고 2차원 그룹 dp[alen][blen];alen,blen은 각각 a,b의 길이를 나타내고 dp[i][j]는 a[i-1]와 b[j-1]로 끝날 때의 가장 긴 공공 서열의 길이를 나타낸다.
그래서 동적 이동 방정식은 다음과 같다.dp[i][j] =0 (i==0||j==0)
dp[i][j] =dp[i-1][j-1]+1 (a[i-1]==b[j-1])
dp[i][j] =max ( dp[i][j-1] , dp[i-1][j] ) (a[i-1]!=b[j-1])
마지막으로 dp[alen][blen]이 구한 결과입니다.
3. 최장 증자 서열 구하기(LIS)
대체적으로 문제는 일련의 숫자 a[n]에서 연속적으로 가장 길게 증가하는 서열을 찾아내 그 길이를 구하는 것이다.
위의 두 문제를 통해 너는 사실 이 문제의 동적 이동 방정식도 매우 쉽게 찾을 수 있다는 것을 발견할 수 있을 것이다.dp[i]를 a[i-1]로 끝나는 숫자열에서 가장 긴 증가 서열의 길이로 설정합니다.그렇게 쉽게dp[i] =max ( dp[j] )+1 dp[j] ={ dp[j] | j<i && a[j] < a[i] };
가장 큰 dp[i]를 두루 찾아보는 것이 요구이다.
같은 이치: 가장 긴 체감 서열의 동적 이동 방정식은 다음과 같다.dp[i] =max ( dp[j] )+1 dp[j] ={ dp[j] | j <i && a[j] > a[i] };
만약 이 세 방정식의 유도에 대해 구체적으로 자세히 알고 싶다면, 이 블로그를 보시기 바랍니다.http://hi.baidu.com/qingmuxiaoyao/item/9ee3f8cd2dacb37789ad9e59
DP에서 가장 중요한 것은 상태와 상태 사이의 이동이다. 상태 이동 방정식을 찾아 귀속 또는 점차적인 방식으로 방정식을 열거하면 제목도 바로 풀린다. 이른바 어려운 문제는 처음에 보면 어찌할 바를 모르고 상태 이동 방정식을 찾지 못하거나 상태가 무엇인지도 똑똑히 볼 수 없다.DP는 ACM의 알고리즘에서 가장 중요한 부분이라고 할 수 있다. 제목의 유형이 변화무쌍하고 제목의 난이도도 차이가 크다. 기교를 중시하는 알고리즘이고 코드의 실현이 상대적으로 쉬우며 1y율이 매우 높다(일부 bt 데이터 제외).한마디로 DP는 항상 매우 중요하고 심오한 알고리즘이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
if(sum[i]<0)
sum[i+1]=a[i+1];
else
sum[i+1]=sum[i]+a[i+1];
dp[i][j] =0 (i==0||j==0)
dp[i][j] =dp[i-1][j-1]+1 (a[i-1]==b[j-1])
dp[i][j] =max ( dp[i][j-1] , dp[i-1][j] ) (a[i-1]!=b[j-1])
dp[i] =max ( dp[j] )+1 dp[j] ={ dp[j] | j<i && a[j] < a[i] };
dp[i] =max ( dp[j] )+1 dp[j] ={ dp[j] | j <i && a[j] > a[i] };
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.