题意:给定一个长度为N(3 <= N <= 5000)的字符串,只用插入字符这种操作,问要使其变成回文字符串,最少需多少步的插入?
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAX 5000
#define min( x, y ) ( x < y ? x : y )
short int dp[MAX + 5][MAX + 5]; //实现搜索的记忆化
char arr[MAX + 5];
int DFS( int a, int b ){
if( a > b )
return 0;
if( dp[a][b] != -1 )
return dp[a][b];
if( a == b ){
dp[a][b] = 0;
return dp[a][b];
}
两种情况的分类讨论
if( arr[a] == arr[b] )
dp[a][b] = DFS( a + 1, b - 1 );
else
dp[a][b] = 1 + min( DFS( a + 1, b ), DFS( a, b - 1 ) );
return dp[a][b];
}
int main()
{
int n;
scanf("%d", &n);
scanf("%s", arr);
memset( dp, -1, sizeof(dp) );
printf( "%d\n", DFS( 0, n - 1 ) );
return 0;
}