当前位置: 首页 > news >正文

DP-最长公共子序列

题面:

样例:

思路:

这里我们状态表示确实比较奇怪,两个序列用二维来表示比较好想,但是这个表示的意义就记住吧hhh。这里比较难想的是状态划分,既然我们想要用前面的来表示后面的(也就是说要用到到推思想)那我们就从到底选不选第一个序列的第i个数以及第二个序列的第j个数来分类。这里一开始划分的时候没想到同时选i,j有一个先决条件。就是这两个数字必须相等,所以我们对a[i],b[j]是否相等来划分序列。

代码:

#include<iostream>
#include<string>

using namespace std;

const int N = 1010;

int n,m;
char a[N],b[N];
int f[N][N];

int main(void)
{
    cin >> n >> m;
    
    for(int i = 1;i <= n;i++) cin >> a[i];
    for(int i = 1;i <= m;i++) cin >> b[i];
    
    //if(a[1] == b[1]) f[1][1] = 1;
    
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= m;j++)
        {
            f[i][j] = max(f[i][j-1],f[i-1][j]);
            if(a[i] == b[j])
            {
                f[i][j] = max(f[i][j],f[i-1][j-1]+1);
            }
            //这里其实可以不写else
            else
            {
                f[i][j] = max(f[i][j],f[i-1][j-1]);
            }
        }
            
            
    cout << f[n][m] << endl;
    
    return 0;
}

tips:

其实自己在想的时候默认选i不选j这种情况就是f[i][j-1],实则不然,f[i][j-1]这个集合是包含了选i不选j这种情况的(选i不选j是小于f[i][j-1]这个集合的),但是这里在这道题里面是不影响的,我们求的是最长值,并不是计算数量的问题,重复了也无所谓。同样我们在算f[i-1][j-1]的时候也是没必要计算的。而且忘记了max只能两个参数hhh。

相关文章:

  • 【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面
  • Qt能正常编译和执行,但是文本报错找不到文件
  • 程函方程的详细推导
  • MySQL_事务的四大特性
  • 【网络安全 | 漏洞挖掘】价值$40000:从路径遍历升级至RCE
  • CSS三大特性——继承、优先级与层叠
  • Redis的预备知识
  • C++中间件DDS介绍
  • 如何从共炮点数据构建速度场,为射线层析或全波形反演提供初始模型(DeepSeek R1回答)
  • AI大模型-提示工程学习笔记13-自动推理并使用工具
  • 52. 类型双关union
  • 使用vue3框架vue-next-admin导出表格excel(带图片)
  • 获取钉钉OA审批数据
  • AI工作流+专业知识库+系统API的全流程任务自动化
  • java练习(33)
  • zookeeper集群配置
  • SAP:SAP的内存管理详解
  • C++ 模板 简单易懂
  • 使用 acme.sh 申请和管理 免费SSL 证书:告别 certbot 的繁琐
  • 【数据挖掘】深度挖掘
  • 广东省发展改革委原副主任、省能源局原局长吴道闻被开除公职
  • 建投读书会·东西汇流|东西方戏剧在上海的相逢、交锋与融合
  • 商标乱象调查:“120W”充电器功率仅12W,120W为商标名
  • 巴勒斯坦民族权力机构主席:哈马斯必须移交武器
  • 男粉丝咬伤女主播嘴后写的条子引争议:赔偿“十万元”还是“十5元”?
  • 全国人大常委会调研组在宁波调研,张庆伟带队钟山易炼红参加