截图 2025-10-30 12-46-37

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.
posted on 2025-10-29 20:37  华容道专家  阅读(5)  评论(0)    收藏  举报