题意:
求最长公共子序列问题
思路:
dp , 然后有坑!题目给的是该序列在正确序列的第几位,还要转换一下。
然后还有一点,下述代码AC,但其实有误,有误部分在代码部分会提及。
错误理由见uva10405http://blog.csdn.net/conatic/article/details/50848324
代码如下:
#include
#include
#include
#include
using namespace std;
const int N = 35;
int a[N], b[N], dp[N][N];
int main() {
int n, t;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &t);
a[t] = i;
}
while (~scanf("%d", &t)) {
b[t] = 1;
for (int i = 2; i <= n; i++) {
scanf("%d", &t);
b[t] = i;
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
if (a[i] == b[j])
/*该部分有误,但还是AC了,为什么错了还是在uva10405解释,正确应为:
for (int i = 1; i <= la; i++) {
for (int j = 1; j <= lb; j++) {
if (A[i - 1] == B[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}*/
dp[i][j] ++;
}
}
printf("%d\n", dp[n][n]);
}
return 0;
}