news 2026/3/8 17:32:12

回文串dp|预处理cost

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
回文串dp|预处理cost

回文串枚举模板

for (int len = 2; len <= n; ++len)
for (int left = 0; left + len <= n; ++left)
int right = left + len - 1;

二维填表min cost时我们会发现需要cost i j,然后就会想到提前预处理计算

(解耦拆分为预处理一次

dp[i][j] = min(dp[i][j], dp[m][j - 1] + cost[m][i - 1]);

lc1278

预处理出任意子串改为回文的最少修改成本

二维dp计算前 i 个字符分割为 j 段回文的最小总成本

最终返回前 n 个字符分割为 k 段的结果

class Solution {
public:
int palindromePartition(string s, int k) {
int n = s.length();
// 替换:计算[left,right]子串改为回文的最少修改数(替代原isPalindrome)
vector<vector<int>> cost(n, vector<int>(n, 0));
for (int len = 2; len <= n; ++len)
for (int left = 0; left + len <= n; ++left) {
int right = left + len - 1;

if (s[left] == s[right]) cost[left][right] = cost[left + 1][right - 1];
elsecost[left][right] = cost[left + 1][right - 1] + 1;
}

// 二维dp[i][j]表示前i个字符分割为j段的最少修改数
vector<vector<int>> dp(n + 1, vector<int>(k + 1, n));
dp[0][0] = 0; // init:前0个字符分割为0段,修改数为0


for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= min(i, k); ++j) {

if (j == 1) dp[i][1] = cost[0][i - 1];

// 分割为1段的情况
else {
for (int m = j - 1; m < i; ++m) {

// 枚举前m个字符分割为j-1段
dp[i][j] = min(dp[i][j], dp[m][j - 1] + cost[m][i - 1]);
}
}
}
}
return dp[n][k];
}
};

1. 回文判断为成本计算:二维数组 cost ,存储 [left,right] 子串改为回文的最少修改字符数。

2. DP二维: dp[i][j] (前 i 个字符分割为 j 段的最少修改数),适配 k 段分割要求

3. 重构DP转移逻辑:按 j 段数遍历,枚举分割点计算 j-1 段加当前段的总成本,取最小值

lcr94

1.二维回文表 预处理填写

for (int len = 2; len <= n; ++len)
for (int left = 0; left + len <= n; ++left)

2.典 转移设计

// dp[i] 代表[0, i] 这段最少分隔回文次数

// 求最小,初始化最大为字符串长度,一一切割
vector<int> dp(n, n);
for (int i = 0; i < n; ++i) {
if(isPalindrome[0][i]) dp[i] = 0;
else {
for (int j = 0; j < i; ++j) { // i转移为了j
if (isPalindrome[j + 1][i])
dp[i] = min(dp[i],dp[j] + 1);
}

class Solution {
public:
int minCut(string s)

{
int n = s.length();
vector<vector<bool>> isPalindrome(n, vector<bool>(n));
for (int i = 0; i < n; ++i)

isPalindrome[i][i] = true;


for (int len = 2; len <= n; ++len)
for (int left = 0; left + len <= n; ++left) {
int right = left + len - 1;
if (len == 2)

isPalindrome[left][right] = s[left] == s[right];
if (len > 2) isPalindrome[left][right] = s[left] == s[right] &&isPalindrome[left + 1][right - 1]; //转移
}


// dp[i] 代表[0, i] 这段最少分隔回文次数
// 求最小,初始化最大为字符串长度,一一切割
vector<int> dp(n, n);
for (int i = 0; i < n; ++i) {
if(isPalindrome[0][i]) dp[i] = 0;
else {
for (int j = 0; j < i; ++j) { // i转移为了j
if (isPalindrome[j + 1][i])
dp[i] = min(dp[i], dp[j] + 1);
}
}
}
return dp[n - 1];
}
};

lc1328

class Solution {
public:
string breakPalindrome(string palindrome)
{
int n=palindrome.size();
if(n==1) return "";
int f=n%2;
for(int i=0;i<n;i++)
{
if(f && i==n/2)
continue;

if(palindrome[i]!='a')
{
palindrome[i]='a';
return palindrome;
}
}
palindrome[n-1]='b';
return palindrome;
}
};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/6 7:55:56

深度学习毕设项目:基于python-CNN深度学习的水稻是否伏倒识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/8 13:19:17

人行道检测数据集介绍-1600张图片 智能导盲系统 城市设施巡检 无障碍环境评估 智能轮椅导航 行人安全预警 市政数字化管理

&#x1f4e6;点击查看-已发布目标检测数据集合集&#xff08;持续更新&#xff09; 数据集名称图像数量应用方向博客链接&#x1f50c; 电网巡检检测数据集1600 张电力设备目标检测点击查看&#x1f525; 火焰 / 烟雾 / 人检测数据集10000张安防监控&#xff0c;多目标检测点…

作者头像 李华
网站建设 2026/3/2 19:40:34

告别高AI率烦恼!2025年精选8款降AI工具实测,助你有效规避AI检测

每当面对学术论文或毕业论文的写作时&#xff0c;很多同学都会有这样的困扰&#xff1a;“明明是我自己写的论文&#xff0c;怎么AI率还这么高&#xff1f;”常常为此煞费苦心&#xff0c;甚至用尽了同义词替换和语序调整等技巧&#xff0c;但效果微乎其微。 于是&#xff0c;…

作者头像 李华
网站建设 2026/2/24 6:21:01

深度学习计算机毕设之基于python-CNN机器学习的常见中草药识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/4 4:53:46

YOLOv8改进 - 注意力机制 | MSCA (Multi-Scale Convolutional Attention) 即插即用增强复杂场景小目标检测鲁棒性

前言 本文介绍了多尺度卷积注意力&#xff08;MSCA&#xff09;及其在YOLOv8中的结合应用。基于变换器的模型在语义分割领域占主导&#xff0c;但卷积注意力在编码上下文信息方面更高效。MSCA由深度卷积聚合局部信息、多分支深度卷积捕获多尺度上下文信息、11逐点卷积模拟通道…

作者头像 李华