第一题不说了,区间dp
1 #include<cstdio> 2 #include<cstdlib> 3 #include<string> 4 #include<cstring> 5 6 using namespace std; 7 8 #define N 1005 9 10 int dp[N][N]; 11 char s[N]; 12 int le; 13 14 int dfs(int l,int r) 15 { 16 if(dp[l][r] != -1) return dp[l][r]; 17 if(l == r) return dp[l][r] = 1; 18 if(l + 1 == r){ 19 if(s[l] == s[r] ) return 2; 20 else return 1; 21 } 22 if(l > r) return 0; 23 if(s[l] == s[r]) return dp[l][r] = dfs(l + 1,r - 1) + 2; 24 dp[l][r] = max( dfs(l + 1,r),dfs(l,r - 1) ); 25 return dp[l][r]; 26 } 27 28 int main() 29 { 30 while(scanf("%s",s)!=EOF) 31 { 32 le = strlen(s); 33 memset(dp,-1,sizeof(dp)); 34 dfs(0,le - 1); 35 printf("%d\n",le - dp[0][le - 1]); 36 } 37 return 0; 38 }