题目:
经典dp,最长公共子序列。
需要注意的是,输入的不是原序列,而是在哪个位置。
原来以为刚开始那组是原系列,老是过不了sample,一直以为是在学生答的那组出错,网上找别人代码来单步,发现学生那组没错,又检查了几遍dp部分,结果最后发现是正确答案那组没有读取好。。。郁闷。。。
#include以后发现过不了sample,得找最好找错的那组来调试,这样才不会浪费时间。。。#define MAXN 50int max(int a, int b){ if (a > b) return a; return b;}int main(){ int a[MAXN] = {0}, b[MAXN] = {0}; int n, tmp; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &tmp); a[tmp - 1] = i; } while (~scanf("%d", &tmp)) { b[tmp - 1] = 1; int c[MAXN][MAXN] = {0}; for (int j = 2; j <= n; j++) { scanf("%d", &tmp); b[tmp - 1] = j; } for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (a[i - 1] == b[j - 1]) c[i][j] = c[i - 1][j - 1] + 1; else c[i][j] = max(c[i - 1][j], c[i][j - 1]); printf("%d\n", c[n][n]); }}