[COGS 172][IOI 2000] 回文词 
              
              
                  book
                  
                    归档:
                    OI  
                  
                
                
                
                  flag
                  
                
                
                
              题目描述
原题地址:COGS
思路
本来没有什么想法,搜了一下题解之后发现一个很妙的方法,将字符串正反各读一遍,然后求最长公共子序列的长度,最后再用总长度减一下就可以了
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5100;
char s[maxn], rs[maxn];
int f[maxn][maxn];
int len;
int main()
{
    freopen("palin.in", "r", stdin);
    freopen("palin.out", "w", stdout);
    scanf("%d%s", &len, s + 1);
    for (int i = 1, j = len; i <= len; ++i, --j)
        rs[i] = s[j];
    for (int i = 1; i <= len; ++i)
        for (int j = 1; j <= len; ++j)
        {
            if (s[i] == rs[j])
                f[i][j] = f[i - 1][j - 1] + 1;
            else
                f[i][j] = max(f[i - 1][j], f[i][j - 1]);
        }
    cout << len - f[len][len] << endl;
}
                 
                
                  navigate_before
                  [COGS 2642][BZOJ 4590][Shoi 2015]自动刷题机
                  
                
                
                
                  [COGS 165] [USACO Mar07] 奶牛交通
                  navigate_next