
const char* s = "a-b--c---d"; int m = strlen(s); const char *t = "ab.c..d"; int n = strlen(t); struct { int val, cnt; } d[64][64]; int pt = 50; void my_pause(int n = pt) { int paused = 0; for (int i = 0; (i < n) || paused; i++) { usleep(10000); int ch = getch(); if (ch == ERR) continue; else if (ch == 'q' || ch == 'Q') exit(0); else if (ch == ' ') paused = !paused; else break; } } void display(int ii, int jj, int set) { for (int i = 0; i <= m; i++) { if (i == ii) attron(COLOR_PAIR(3)); mvaddch(3, 16+i*2, s[i] ? : ' '); // gcc feature if (i == ii) attroff(COLOR_PAIR(3)); } for (int j = 0; j <= n; j++) { if (j == jj) attron(COLOR_PAIR(3)); mvaddch(5, 16+j*2, t[j] ? : ' '); if (j == jj) attroff(COLOR_PAIR(3)); } for (int i = 0; i <= m; i++) for (int j = 0; j <= n; j++) { int v = d[i][j].val; char s[16] = " ? "; if (v >= 0) sprintf(s, "%d %d", v, d[i][j].cnt); if (i == ii && j == jj) attron(COLOR_PAIR(set ? 2 : 1)); mvprintw(7+i, 10+j*6, "%s", s, d[i][j].cnt); if (i == ii && j == jj) attroff(COLOR_PAIR(set ? 2 : 1)); } refresh(); my_pause(); } int lcs (int i, int j) { display(i, j, 0); int v; if (i == m || j == n) v = 0; else if (s[i] == t[j]) { int a = d[i+1][j+1].cnt++ ? d[i+1][j+1].val : lcs(i+1, j+1); v = 1 + a; } else { int a = d[i][j+1].cnt++ ? d[i][j+1].val : lcs(i, j+1); int b = d[i+1][j].cnt++ ? d[i+1][j].val : lcs(i+1, j); v = a > b ? a : b; } d[i][j].val = v; ++d[i][j].cnt; display(i, j, 1); return v; } int main (int argc, char* argv[]) { if (argc == 2) pt = atoi(argv[1]); for (int i = 0; i <= m; i++) for (int j = 0; j <= n; j++) d[i][j].val = -1; initscr(); start_color(); init_pair(1, COLOR_WHITE, COLOR_RED); init_pair(2, COLOR_GREEN, COLOR_BLACK); init_pair(3, COLOR_BLUE, COLOR_WHITE); cbreak(); noecho(); timeout(0); curs_set(0); atexit((void (*)())endwin); int n = lcs(0,0); my_pause(1000); return n; } #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <ncurses.h>
编译:gcc lcs.cpp -lncursesw 不带w的ncurses不能显示汉字;我想w代表wide. -l得放最后面。
运行:a.out; echo $? 看main的返回值。
- 最长公共子串和最长公共子序列不一样。GNU diff求最长公共子序列,估计(基本原理)把行当“字符”,比较用strcmp而不是==
- 动态规划(Dynamic Programming, DP)是运筹学的重要分支,由Richard Bellman在1950s初提出,用于解决多阶段决策过程的最优化问题。核心思想是将复杂问题分解为相互关联的子问题,通过状态转移方程建立递推关系,并利用存储中间结果避免重复计算。
- DP是方法论而非算法,需针对具体问题设计状态转移方程。线性规划(Linear Programming, LP)是数学优化算法,有明确的数学表达式(如目标函数和约束条件)。
- DP擅长处理离散型、多阶段决策问题(如背包问题、最短路径)。LP适用于连续变量的优化问题(如资源分配、生产调度)。
- DP通过“空间换时间”策略,将指数复杂度降至多项式级别。LP依赖单纯形法或内点法,计算复杂度与问题规模呈多项式关系。
- 单纯形法(Simplex Method)由George Dantzig于1947年提出,是线性规划领域首个实用算法。核心思想是通过遍历可行域的顶点(凸多面体的角点)逐步逼近最优解。
- 内点法(Interior-Point Method)由Narendra Karmarkar于1984年提出,通过可行域内部路径直接逼近最优解。
- the curse [sing] (dated infml 旧, 口) menstruation 月经; 行经: I've got the curse today. 我今天来月经了。
- ncurses是new curses (多了彩色等)。curse和cursor optimization有关。
- 女拳得到了chairperson,却忘了把menstruation改成womenstruation.
浙公网安备 33010602011771号