poj 1159 动态规划+滚动数组

 题意:

       给你你个字符串,让你求出在中间最少加入几个字符可以让他变成一段回文子串。

思路:

       字符串S和其逆串S1,求其最长公共子序列即可的长度A即可,字符串S长度减去A即为所求答案。

状态转移方程:

      dp[i][j]=dp[i-1][j-1]+1;      (s[i]==s1[j])

      dp[i][j]=max(dp[i-1][j],dp[i][j-1]);  (s[i]!=s1[j])

如果直接开dp[5005][5005]会MLE,所以这里需要使用动态数组(滚动数组)。

滚动数组解析:https://blog.csdn.net/caizi1991/article/details/24908877

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mset(a,b)   memset(a,b,sizeof(a))
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
//const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
//priority_queue,greater >q;
//vectorve[30003];
//priority_queueq;
//struct node
//{
//    int x,y,z;
//    bool operator <(const node w) const
//    {
//        return z>tmp;
            s1[i]=s2[n-i+1]=tmp;
        }
        int ma=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(s1[i]==s2[j])//如果字符相等,则继承前一行前一列的dp值+1
                    dp[i%2][j]=dp[(i-1)%2][j-1]+1;
                else//否则,取上方或左方的最大dp值
                    dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
                if(ma

 

你可能感兴趣的:(最长公共子序列)