UVa 111 History Grading (最长公共子序列)
经典dp,最长公共子序列。
需要注意的是,输入的不是原序列,而是在哪个位置。
原来以为刚开始那组是原系列,老是过不了sample,一直以为是在学生答的那组出错,网上找别人代码来单步,发现学生那组没错,又检查了几遍dp部分,结果最后发现是正确答案那组没有读取好。。。郁闷。。。
#include <cstdio> #define MAXN 50 int 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]); } }
以后发现过不了sample,得找最好找错的那组来调试,这样才不会浪费时间。。。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步