您的位置:首页 > 其它

UVA - 111 History Grading

2014-11-14 16:30 246 查看
题目大意:给出一个 n 代表序列中元素的个数, 然后是一个答案, 接下来是若干个同学的答案(直到文件结束为止), 求出两个序列的最长公共子序列, 注意给出的答案均是以该事件处于第几个发生的, 例如 :2 3 4 1

即是 对应第1个事件在第2个发生,第2个事件在第3个发生 ...转换一下就是  4 1 2 3

解题思路:最长公共子序列问题, 状态转移方程

                      0                                         ( i == 0 ||  j == 0)

 d[i][j] =
        d[i - 1] [j - 1] + 1                    ( a[i] == b[i])

                      max(d[i - 1][j] , d[i] [j - 1])     ( a[i] != b[i])

#include <iostream>
using namespace std;

int main() {
int n, temp, A[25], B[25], DP[25][25] = {0};
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> temp;
A[temp] = i;
}

while (cin >> temp) {
B[temp] = 1;
for (int i = 2; i <= n; i++) {
cin >> temp;
B[temp] = i;
}

for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (A[i] == B[j])
DP[i][j] = DP[i-1][j-1] + 1;
else
DP[i][j] = max(DP[i][j-1], DP[i-1][j]);

cout << DP

<< endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: