这是一题典型的最大公共子序列。一开始没看出来,直到写dp写不下去,赶紧去翻busycai大牛的程序才恍然大悟。 用f[i][k]表示a取到i,b取到k时最大的权值。f[i][k] = max (f[i - 1][k - 1] + v[i], f[i][k - 1], f[i - 1][k])。其中第一个表示i和k时取到相同的字符。 #include <cstdio>#include <string> int v[501], n, ans, f[2001][2001], len;char str[2][2001]; int dp (){ int i, k; len = strlen (str[0]); memset (f, 0, sizeof(f)); for (i = 1; i <= len; i ++) { for (k = 1; k <= len; k ++) { if (str[0][i - 1] == str[1][k - 1]) { f[i][k] = f[i - 1][k - 1] + v[str[0][i - 1]]; } int mx = f[i - 1][k] > f[i][k - 1] ? f[i - 1][k] : f[i][k - 1]; if (mx > f[i][k]) f[i][k] = mx; } } return f[len][len];} int main (){ //freopen ("in.txt", "r", stdin); while (scanf ("%d", &n) != EOF) { int i, value; char ch; for (i = 0; i < n; i ++) { getchar (); scanf ("%c %d", &ch, &value); v[ch] = value; } scanf ("%s %s", &str[0], &str[1]); printf ("%d\n", dp ()); //pf (); } return 0;}

评论