http://acm.pku.edu.cn/JudgeOnline/problem?id=1159 #include<stdio.h> char str[5001]; short int data[5005][5005] = {0};//这里用int 会超内存 int main() { int len; long max = 0,i ,j; scanf("%d%s",&len,str); //len = strlen(str1); for(i = 0;i < len ;i++) { for(j = 0;j< len-i;j++) { if(i == 0) data[j][j+1] = 0; else if(i == 1) { if(str[j] == str[j+1]) data[j][j+i] = 0; else data[j][j+i] = 1; } else { if(str[j] == str[j+i]) data[j][j+i] = data[j+1][j+i-1]; else data[j][j+i] = (data[j][j+i-1]<data[j+1][j+i]?data[j][j+i-1]:data[j+1][j+i]) + 1; } } } printf("%d",data[0][len-1]); return 0; } 简单的DP 从长度为一开始 到 len 一步一步过来 最后得到结果 既是 还有一个想法是用轮换数组