http://poj.org/problem?id=1159
时间复杂度n2算法(n<5000) 814MS 212K 供参考
求出逆序列的最长公共子序列长度 再用len减他即可
因为n=5000, 若dp [n][n] 超内存, 听说可以改成short 水过
也可以使用滚动数组 具体看代码


#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> const int maxn = 5005; char a[maxn], b[maxn]; int dp[2][maxn], len; int max(int a, int b) { return a>=b ?a :b ; } void reverse() { for(int i=1; i<=len; i++) { b[i] = a[len+1-i] ; } } int main() { while(scanf("%d", &len)!=EOF) { scanf("%s", a+1); bool flag = 1; reverse(); memset(dp, 0, sizeof(dp)); for(int i=1; i<=len; i++) { for(int j=1; j<=len; j++) { dp[flag][j] = max(dp[!flag][j], dp[flag][j-1]); if( a[i] == b[j] ) dp[flag][j] = max(dp[flag][j], dp[!flag][j-1]+1); } flag = !flag ; } printf("%d\n", len - dp[!flag][len]); } return 0; }