生活随笔
收集整理的這篇文章主要介紹了
动态规划经典算法--最长公共子序列 LCS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉移方程
代碼:
#include <bits/stdc++.h>
using namespace std
;
int dp
[100][100];
string s
[100][100];
int main()
{string a
, b
;cin
>> a
>> b
;dp
[0][0] = 0;memset(dp
, 0, sizeof(dp
));for (int i
= 0; i
< a
.size(); i
++)for (int j
= 0; j
< b
.size(); j
++){if (a
[i
] == b
[j
]){dp
[i
+ 1][j
+ 1] = dp
[i
][j
] + 1;s
[i
+ 1][j
+ 1] = s
[i
][j
] + a
[i
];}else{if (dp
[i
+ 1][j
] > dp
[i
+ 1][j
]){dp
[i
+ 1][j
+ 1] = dp
[i
+ 1][j
];s
[i
+ 1][j
+ 1] = s
[i
+1][j
] ;}else {dp
[i
+ 1][j
+ 1] = dp
[i
][j
+1];s
[i
+ 1][j
+ 1] = s
[i
][j
+1] ;}}}cout
<<dp
[a
.size()][b
.size()]<<endl
;cout
<<s
[a
.size()][b
.size()];
}
#include <bits/stdc++.h>
using namespace std
;
string a
, b
;
int dp
[100][100];
int c
[100][100];
void printAns(int i
, int j
)
{if (i
== -1 || j
== -1)return;if (c
[i
][j
] == 0){printAns(i
- 1, j
- 1);cout
<< a
[i
];}else if (c
[i
][j
] == 1)printAns(i
, j
- 1);elseprintAns(i
- 1, j
);
}
int main()
{cin
>> a
>> b
;dp
[0][0] = 0;for (int i
= 0; i
< a
.size(); i
++)for (int j
= 0; j
< b
.size(); j
++){if (a
[i
] == b
[j
]){dp
[i
+ 1][j
+ 1] = dp
[i
][j
] + 1;c
[i
][j
] = 0; }else{if (dp
[i
+ 1][j
] > dp
[i
+ 1][j
]){dp
[i
+ 1][j
+ 1] = dp
[i
+ 1][j
];c
[i
][j
] = 1; }else{dp
[i
+ 1][j
+ 1] = dp
[i
][j
+ 1];c
[i
][j
] = -1; }}}cout
<< dp
[a
.size()][b
.size()] << endl
;printAns(a
.size() - 1, b
.size() - 1);cout
<< endl
;
}
總結
以上是生活随笔為你收集整理的动态规划经典算法--最长公共子序列 LCS的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。