NYOJ-37 回文字符串 —— LCS变形
2024-08-29 18:02:00
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=37
题解:
一开始想从两边向中间添加字符,发现这样不是最优的。因为加入字符之后,这些原本存在的字符是离散的,所以就不能用顺序的方法去添加。
正确做法是将字符串逆过来,与原字符串求最大公共子序列。最大公共子序列即是不需要添加的字符序列,那么剩下的len-dp[len][len]就是需要添加进去的最少字符个数,使得原来的字符串刚好构成回文串。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <sstream>
#include <algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
#define ms(a, b) memset((a), (b), sizeof(a))
#define eps 0.0000001
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+;
const int maxn = +; char s[maxn];
int dp[maxn][maxn]; void solve()
{
scanf("%s",s);
int len = strlen(s);
for(int i = ; i<len; i++)
{
for(int j = ; j<len; j++)
{
if(s[i]==s[len--j])
dp[i+][j+] = dp[i][j] + ;
else
dp[i+][j+] = max(dp[i][j+],dp[i+][j]);
}
}
printf("%d\n", len-dp[len][len]);
} int main()
{
int T;
scanf("%d",&T);
while(T--){
ms(dp,);
solve();
}
}
最新文章
- Java System.getProperty()方法获取系统信息
- oracle数据库建表
- mysql-锁表机制分析(转)
- Property工具类,Properties文件工具类,PropertiesUtils工具类
- [LeetCode#202] Roman to Integer
- Xcode6中如何修改文件中自动创建的Created by和Copyright
- 9.python异常处理
- 代码中输入数字自动筛选出最大值,使用array,for loop and if (21.9.2017)
- [USACO17JAN]Promotion Counting晋升者计数
- 【codeforces 983E】NN country
- Java并发编程-AbstractQueuedSynchronizer源码分析
- Idea问题:“marketplace plugins are not loaded”解决方案
- C++学习之 —— 输入输出
- python中的zip、lambda、map操作
- httpClient创建对象、设置超时
- 【二分图最大匹配】【匈牙利算法】zoj3988 Prime Set
- 29Spring_Autowriter的一些疑惑(很重要)
- JavaScript中this关键字的使用比较
- Selenium2+python自动化59-数据驱动(ddt)【转载】
- Appstore 提交时错误