题目来源:[NWPU][2014][TRN][6]动态规划第一讲——简单线性dp H题
http://vjudge.net/contest/view.action?cid=49759#problem/H
作者:npufz
题目:给定一个字符串,为使之变成一个回文串,即从左读或者从右读是完全等价的,需要添加一些字符进去,可以添加到任意位置,但不能打乱原来的字符的次序,求算出添加 最少的字符的个数,给定的字符串最多有5000个字符,最少有3个字符
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
short dp[5005][5005];
int main()
{ int i,j,k,num;
char s1[5005],s2[5005];
cin>>num;
scanf(" %s",s1);
j=0;
for(i=num-1;i>=0;i--)
s2[j++]=s1[i];
//s2[j]='\0';puts(s2);
if(s1[0]==s2[0]) dp[0][0]=1;
for(i=0;i<num;i++)
for(j=0;j<num;j++)
{
if(i==0&&j-1>=0)
{
if(s1[0]==s2[j]) dp[0][j]=1;
else dp[0][j]=dp[0][j-1];
}
if(j==0&&i-1>=0)
{
if(s1[i]==s2[0]) dp[i][0]=1;
else dp[i][0]=dp[i-1][0];
}
if(i-1>=0&&j-1>=0)
{
if(s1[i]!=s2[j]) dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(s1[i]==s2[j])
{
if(dp[i-1][j-1]+1>max(dp[i-1][j],dp[i][j-1]))
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
k=num-dp[num-1][num-1];
cout<<k<<endl;
return 0;
}
反思:这是一个简单的DP,但是第一次就MLE 了,由于规划数组开的太大,改成SHORT的就OK了