【C++】最长回文子串/动态规划
2024-08-24 14:20:24
ACM
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
char S[maxn];
int dp[maxn][maxn];
int main()
{
gets(S);
int len = strlen(S), ans = 1;
memset(dp, 0, sizeof(dp));
for (int i = 0; i < len; i++)
{
dp[i][i] = 1;
if (i < len - 1)
{
if (S[i] == S[i + 1])
{
dp[i][i + 1] = 1;
ans = 2;
}
}
}
// 状态转移方程
for (int L = 3; L <= len; L++)
{
for (int i = 0; i + L - 1 < len; i++)
{
int j = i + L - 1;
if (S[i] == S[j] && dp[i + 1][j - 1] == 1)
{
dp[i][j] = 1;
ans = L;
}
}
}
cout << ans;
system("pause");
}
核心代码
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
int getLongestPalindrome(string A, int n)
{
int maxR = 1;
// 创建dp数组
vector<vector<int>> dp;
vector<int> tmp;
tmp.insert(tmp.begin(), n, 0);
for (int i = 0; i < n; i++)
{
dp.push_back(tmp);
}
// 边界条件
for (int i = 0; i < n; i++)
{
dp[i][i] = 1;
if (i < n - 1)
{
if (A[i] == A[i + 1])
{
dp[i][i + 1] = 1;
maxR = 2;
}
}
}
// 状态转移
for (int len = 3; len <= n; len++)
{
// 枚举左端点i
for (int i = 0; i + len - 1 < n; i++)
{
int j = i + len - 1;
if (A[i] == A[j] && dp[i + 1][j - 1] == 1)
{
dp[i][j] = 1;
maxR = len;
}
}
}
return maxR;
}
};
int main()
{
string str;
cin >> str;
int n = str.length();
Solution solution;
cout << solution.getLongestPalindrome(str, n) << endl;
system("pause");
}
最新文章
- Yslow-23条规则
- Uva1398 Meteor
- PHP使用数据库的并发问题(转)
- ios应用数据存储的常用方式 ios7.1应用沙盒
- python(3)-集合
- 函数 xdes_get_state
- 对MMU段式转换的理解
- float
- springMVC servlet 静态资源加载
- Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法[转]
- 你知道android的MessageQueue.IdleHandler吗?
- bootstarp模板02
- 全球第一免费开源ERP Odoo仓存功能模块深度应用(一)
- Java对象序列化全面总结
- [java初探总结篇]__java初探总结
- 如何在 ASP.NET Core 测试中操纵时间?
- 学Android开发的人可以去的几个网站
- 【Python】使用torrentParser1.03对单文件torrent的分析结果
- python -- numpy 基本数据类型,算术运算,组合,分割 函数
- Spring Boot 上传文件 获取项目根路径 物理地址 resttemplate上传文件