최대 공통 하위 시퀀스(LCS 문제)의 DP 해법
3248 단어 기초 알고리즘 예제동적 기획문자열
제목 묘사 약.
문제풀이 사상은 바로 DP이다. DP는 두 가지를 알아야 한다. 하나는 상태가 무엇인지, 다른 하나는 상태 간의 점차적인 관계가 무엇인지.
이 문제는 2차원 DP입니다. 상태 dp[i][j]를 사용하면str1이 i자 (i 포함) 를 얻었고,str2가 j자 (j 포함) 를 찾았을 때 가장 긴 공통 서열의 길이를 나타냅니다.(i, j 값은 1부터 시작)
점진적 관계식은 다음과 같습니다.
dp[i][j] = 0 (i = 0 또는 j = 0)
dp[i][j] = max(
dp[i-1][j-1]+1, (만약str1[i]=str2[j])
dp[i-1][j],
dp[i][j-1]
);
종합하면 가장 긴 공통 서열 길이를 구하는 코드를 쓸 수 있으며 HDU1159로 검증할 수 있다. 이 문제는 LCS 템플릿 문제다.
//아래 코드에 실제 저장된 문자열은 0에서 시작하고 dp수조는 1에서 시작합니다.
#include
#include
#include
#include
using namespace std;
int dp[1000][1000];
int main(){
string str1,str2;
while(cin>>str1>>str2){
memset(dp, 0, sizeof(dp));
int m = str1.length();
int n = str2.length();
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(str1[i-1] == str2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}
dp[i][j] = max(dp[i-1][j], dp[i][j]);
dp[i][j] = max(dp[i][j-1], dp[i][j]);
}
}
cout<
그리고 필기 면접을 볼 때 이 가장 긴 공공 서열을 출력할 수 있습니다. 제가 사용하는 방법은 구조체를 구축하는 것입니다. 모든 DP 상태에서 이 상태가 어느 상태에서 밀려왔는지, 그리고 이 상태에 새로운 상등 문자가 추가되었는지 보존하는 것입니다.이렇게 하면 dp[m][n]상태에서 이 상태가 처음에 어떤 상태에서 유추되었는지 거슬러 올라갈 수 있고 가장 긴 공공 서열이 무엇인지 알 수 있다.
코드는 다음과 같습니다. 이 코드의 주석 부분에서 출력을 디버깅하여 쉽게 이해할 수 있습니다.
#include
#include
#include
#include
#include
using namespace std;
struct NODE{
int len;
int preX;
int preY;
bool selected;
NODE(){
len = 0;
preX = -1;
preY = -1;
selected = false;
}
NODE(int l, int x, int y, bool s){
len = l;
preX = x;
preY = y;
selected = s;
}
};
NODE dp[1000][1000];
string str1,str2;
int m,n;
void printLCS(){
cout< st;
int i = m, j = n;
while(i!=-1 && j!=-1){
//cout<>str1>>str2){
m = str1.length();
n = str2.length();
for(int i=0;i<=m;i++){
for(int j=0;j<=n;j++){
dp[i][j] = NODE();
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(str1[i-1] == str2[j-1]){
dp[i][j] = NODE(dp[i-1][j-1].len + 1, i-1, j-1, true);
//cout<dp[i][j].len){
dp[i][j] = NODE(dp[i-1][j].len, i-1, j, false);
//cout<dp[i][j].len){
dp[i][j] = NODE(dp[i][j-1].len, i, j-1, false);
//cout<
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제11회 산동성 대학생 프로그램 설계 경연대회 Adventurer's Guild(dp)전송문 제목: 몬스터의 수량 n, 캐릭터의 생명력 H, 캐릭터의 공격 S 건네기;다음 n행, 매 행위 매 몬스터의 혈액량 h, 공격 s, 가치 w; 매번 몬스터를 처치할 때마다 h의 혈액량과 s의 공격을 소모한다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.