题意:给你一个字符串,求使其变成回文串所添加的字母的最少数
dp【i】【j】 表示i到j变成回文串所需添加的最少字母数
if s【i】 == s【j】 dp【i】【j】 = dp【i+1】【j-1】
else dp[i][j] = min( dp[i][j-1] , dp[i+1][j-1] ) + 1
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
short int dp[5100][5100];
int N;
char s[5500];
int DFS( int pos1, int pos2 ){
if( pos1 >= pos2 ){
return 0;
}
if( dp[pos1][pos2] != -1 ){
return dp[pos1][pos2];
}
int ans = MAX;
if( s[pos1-1] == s[pos2-1] ){//注意这里如果能相等 则只考虑相等的情况 不然会超时
ans = min( ans, DFS( pos1 + 1, pos2 - 1 ) );
}else{
ans = min( ans, DFS( pos1, pos2 - 1 ) + 1 );
ans = min( ans, DFS( pos1 + 1, pos2 ) + 1 );
}
return dp[pos1][pos2] = ans;
}
int main(){
while( scanf( "%d", &N ) != EOF ){
scanf( "%s", s );
memset( dp, -1, sizeof( dp ) );
cout << DFS( 1, N ) << endl;
}
return 0;
}