牛客竞赛每日俩题 - 动态规划4

简介: 牛客竞赛每日俩题 - 动态规划4

经典dp(最长公共序列)

最长公共子序列__牛客网

解析:

有两个字符串T和S,S的长度为n T的长度为m

状态:f[i][j] 表示n的前 i 个字母,和m的前 j 个字母的最长公共子序列长度

情况一:s[i]==t[i]因为两个字符相同,所以 该最长公共子序列==除这两个字符外的最长公共子序列+1;

即f[i][j]==f[i-1][j-1]+1;

情况二:s[i]!=t[i]

如果两个字符不同,则最长序列可能在只包含si或ti的组合串中;

// 参考自id:没有头的小蘑菇
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
//int dp[110][110];
int main()
{
    string s1, s2;
    while(cin>>s1>>s2)
    {
        vector<vector<int>> dp(s1.size()+1,vector<int>(s2.size()+1, 0));
        //memset(dp,0,sizeof dp);
        for(int i = 1; i <= s1.size(); i++)
            for(int j = 1; j<= s2.size(); j++)
            {
                if(s1[i-1] == s2[j-1])
                    dp[i][j] = dp[i-1][j-1]+1;
                else
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
            }
        cout<<dp[s1.size()][s2.size()]<<endl;
    }
    return 0;
}

经典dp(最长上升子序列

最长上升子序列__牛客网

【解题思路】

动态规划的难点在于定义数组和创建“状态转移方程”。

1. 定义height来存储数据,f[i]为以height[i]结尾的元素的最长上升子序列元素个数,初始时

将f所有内容全部初始化成1,因为子序列中至少包含一个元素。

状态表示:f[i]表示从第一个数字开始算,以height[i]结尾的最大的上升序列。(以height[i]结尾的所有上升序列中属性为最大值的那一个)


状态计算(集合划分):j∈(0,1,2,..,i-1), 在height[i] >height[j]时,

f[i] = max(f[i], f[j] + 1)。

有一个边界,若前面没有比i小的,f[i]为1(自己为结尾)。


最后在找f[i]的最大值。

// write your code here cpp
#include <iostream>
#include <vector>
using namespace std;
int main(){
    int n;
    while(cin >> n){
        vector<int> height(n, 0);
        for(int i = 0; i < n; i ++){
            cin >> height[i];
        }
        vector<int> f(n, 1);//初始每个数字长度为1
        int result = 1;
        for(int i = 1; i < n; i ++){
            for(int j = 0; j < i; j ++){
                if(height[i] > height[j])//说明该数字比该序列所有数字大
                {
                    f[i] = max(f[i], f[j] + 1);//f[j]+1将这个数字放在序列前面
                }
            }
            result = max(result, f[i]);
        }
        cout << result << endl;
    }
}

非dp巧妙写法

// write your code here cpp
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n;
    while(cin >> n)
    {
        vector<int> ret;
        int num;
        int i;
        while(n--)
        {
            cin >> num;
            i = 0;
            for(; i < ret.size(); ++i)
            {
                if(num <= ret[i])
                {
                    ret[i] = num;
                    break;
                }
            }
            if(i == ret.size())
                ret.push_back(num);
        }
        cout << ret.size() << endl;
    }
}
相关文章
|
消息中间件 Java API
RocketMQ事务消息, 图文、源码学习探究~
介绍 RocketMQ是阿里巴巴开源的分布式消息中间件,它是一个高性能、低延迟、可靠的消息队列系统,用于在分布式系统中进行异步通信。 从4.3.0版本开始正式支持分布式事务消息~ RocketMq事务消息支持最终一致性:在普通消息基础上,支持二阶段的提交能力。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。 原理、流程 本质上RocketMq的事务能力是基于二阶段提交来实现的 在消息发送上,将二阶段提交与本地事务绑定 本地事务执行成功,则事务消息成功,可以交由Consumer消费 本地事务执行失败,则事务消息失败,Consumer无法消费 但是,RocketMq只能保证本地事务
IDEA改变菜单栏,字体大小,配置文件编码
IDEA改变菜单栏,字体大小,配置文件编码
1255 0
IDEA改变菜单栏,字体大小,配置文件编码
|
存储 安全 Linux
基于私链的去中心化交易所模式系统定制开发部署规则解析
如果采用私链构建交易所,我们就需要解决资产控制权的问题。 公链可以做到资产链上存储,资产上链,配合撮合器实现价值转移。交易撮合成功后,交易记录上链,买方与卖方之间的交易均为钱包点对点,链上合约转账。以此实现交易所去资产托管。
|
存储 编解码 搜索推荐
Adobe Incopy2023最新版本下载安装教程
Adobe Incopy是一款功能强大的创意制作软件,为作家、写作、设计师等创意人员提供合作写作、排版和设计功能。是很多人从事文字和图形创意工程的理想选择和应用InCopy,文案人员和编写人员可以设计文本风格,跟踪变更,简单修改文档布局,设计师可以同时设计文本风格,跟踪变更,同时修改文档Adobe InDesign处理同一文档–而不是覆盖对方的手稿。本软件主要用于文本风格设计、跟踪变更和文档布局修改。新版本激活了数千种字体,适用于Open Type SVG字体,可以在表格中插入脚注,带来更快的排版感。
301 0
|
机器学习/深度学习 人工智能 自然语言处理
斯坦福春季新课:用数据科学、机器学习对COVID-19研究建模
斯坦福春季新课:用数据科学、机器学习对COVID-19研究建模
291 0
怎么换网站模板?
速成网站创业版和国际版可以换模板,方法如下:1、登录速成网站管理后台,点击左上角的:设计,再点管理,如下图: 2、再点左侧的:控制面板,然后点:更换模板,如下图: 3、点击选中要改的模板,再点:选取。
2227 0
|
6天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
8天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
1074 13
|
4天前
|
云安全 安全
免费+限量+领云小宝周边!「阿里云2026云上安全健康体检」火热进行中!
诚邀您进行年度自检,发现潜在风险,守护云上业务连续稳健运行
1170 2