【笔试强训】day10

简介: 【笔试强训】day10

1.最长回文子串

思路:

常规思路就是dp。dp[i][j]表示字符串i-j是否是回文子串。

如果A[i]==A[j],考虑以下几种情况:

长度小于3,说明一定是回文。

要想让dp[i][j]为真,则dp[i+1][j-1]必须也为真。否则就是false.即dp[i][j]=dp[i+1][j-1]

顺便用一个ans维护一下答案就好了

这种做法的复杂度是N^2.还有一种叫马拉夫的做法,On的复杂度,但是我忘了,草。

代码:

#define _CRT_SECURE_NO_WARNINGS 1
class Solution {
public:
 
    int getLongestPalindrome(string A) {
        int n = A.size();
        vector<vector<bool>> dp(n + 1, vector<bool>(n + 1));
        if (A.size() == 1)return 1;
 
        for (int i = 1; i <= n; i++) {
            dp[i][i] = true;
        }
        int ans = 1;
        for (int len = 1; len <= n; len++) {
            for (int l = 1; l + len - 1 <= n; l++) {
                int r = l + len - 1;
                if (len == 1)continue;
                if (A[l - 1] != A[r - 1]) {
                    dp[l][r] = false;
                }
                else {
                    if (len <= 3)dp[l][r] = true;
                    else dp[l][r] = dp[l + 1][r - 1];
                }
 
                if (dp[l][r])ans = max(ans, r - l + 1);
            }
        }
        return ans;
 
    }
};

2.买股票的最佳时机(一)

思路:

暴力枚举。假设我们在第i天买入,那么在什么时候卖掉最合适呢?在第i天之后哪一天的票价最高我们就在哪一天卖掉。所以我们可以再用一个数组s[],s[i]表示i-n天的最高票价

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int s[N];
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    s[n] = a[n];
    for (int i = n - 1; i >= 1; i--) {
        s[i] = max(s[i + 1], a[i]);
    }
 
    int ans = 0;
    for (int i = 1; i < n; i++) {
        ans = max(ans, s[i + 1] - a[i]);
    }
    cout << ans;
 
    return 0;
}

3.过河卒

思路:

一眼看上去dfs,做了一遍直接超时了(优化一下应该就能过)。后来换了种思路,借用类似杨辉三角的做法。

dp[i][j]表示,从起点到(i,j)的路径有多少。如果没有马的干扰,那么dp[i][j]=dp[i-1][j]+dp[i][j-1]

首先如果i,j本身就是马的范围,那么直接滚,表示走到这个点的路径数0。

换而言之,就是遇到马步直接跳过。

代码:

 
#include <iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int N = 50;
long long f[N][N];
bool st[N][N];
int n, m, x, y;
int dx[] = { 0, -2, -1, 1, 2, 2, 1, -1, -2 };
int dy[] = { 0, 1, 2, 2, 1, -1, -2, -2, -1 };
 
bool check(int a, int b) {
    if (x == a && y == b)return false;
    if (abs(a - x) + abs(b - y) == 3) {
        return false;
    }
    // cout<<abs(a - x) + abs(b - y) <<"--"<<endl;
    return true;
}
int main() {
    int n, m, x, y;
    cin >> n >> m >> x >> y;
    if (n == x && m == y) {
        cout << 0 << endl;
        return 0;
    }
 
    for (int i = 0; i < 9; i++) {
        int a = x + dx[i];
        int b = y + dy[i];
        if (a >= 0 && a <= n && b >= 0 && b <= m)st[a][b] = true;
    }
    for (int i = 1; i <= m; i++) {
        if (st[0][i]) {
            break;
        }
        f[0][i] = 1;
        //cout<<i<<" ";
    }
    for (int i = 1; i <= n; i++) {
        if (st[i][0]) {
            break;
        }
        f[i][0] = 1;
        //cout<<i<<" ";
    }
    f[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (st[i][j])continue;
            if (!st[i - 1][j])f[i][j] += f[i - 1][j];
            if (!st[i][j - 1])f[i][j] += f[i][j - 1];
            //  cout<<f[i][j]<<" ";
        }
        //cout<<endl;
    }
 
    cout << f[n][m] << endl;
    return 0;
}


相关文章
|
存储 SQL 数据库
【赵渝强老师】达梦数据库的数据库对象
达梦数据库包含基本与复杂两大类数据库对象。基本对象如表、索引、视图、序列和同义词,通过单一DDL语句创建和管理。表是数据存储核心,支持多种数据类型;索引提升查询速度,常见类型包括聚集、唯一、函数等索引;视图提供虚表功能;序列生成有序整数;同义词简化对象访问。复杂对象包括存储过程、函数和触发器,需用DMSQL语言开发,适用于更复杂的业务逻辑处理。文中通过实例详细介绍了各类对象的创建与使用方法。
660 3
|
缓存 算法 关系型数据库
MIT韩松团队长上下文LLM推理高效框架DuoAttention:单GPU实现330万Token上下文推理
麻省理工学院韩松团队提出DuoAttention框架,旨在提高大型语言模型(LLM)处理长上下文的效率。该框架通过区分检索头和流式头,仅对检索头应用全键值缓存,减少内存消耗和计算时间,同时保持模型长上下文处理能力。实验结果显示,DuoAttention在多种模型架构上显著提升了推理效率,为LLM的实际应用提供了新可能。
511 14
|
人工智能 安全 Android开发
探索安卓与iOS的安全性差异:一场永无止境的较量
在移动操作系统的领域中,安卓(Android)和iOS以其独特的优势各自占领了市场的一大半江山。但它们在安全性上的差异,一直是业界和用户关注的焦点。本文将深入分析这两个平台的安全架构、更新机制以及隐私保护措施等方面的差异,揭示它们如何在不断的攻防对抗中进化,以及这些差异对用户选择的潜在影响。通过比较研究,我们将探讨哪种系统更能有效地保护用户免受恶意软件和网络攻击的威胁,并讨论未来移动安全趋势可能如何塑造这两种系统的发展方向。
515 26
|
存储 Linux Shell
深入理解Linux操作系统的启动过程
【10月更文挑战第21天】本文将深入浅出地介绍Linux操作系统的启动过程,包括BIOS、引导加载程序、内核初始化和系统服务启动等环节。通过阅读本文,您将了解到Linux启动过程中的关键步骤和相关概念,以及如何优化启动速度。
334 1
|
Oracle 关系型数据库 数据库
PostgreSQL和Oracle两种数据库有啥区别?如何选择?
PostgreSQL和Oracle两种数据库有啥区别?如何选择?
995 0
|
JavaScript 前端开发 HTML5
15个漂亮的企业网站设计案例欣赏
您可能感兴趣的相关文章 寻找网页设计灵感的27个最佳网站推荐 分享35个非常漂亮的单页网站设计案例 60佳灵感来自大自然的网页设计作品欣赏 分享45款高质量的免费HTML/CSS模板 最新30佳精美 PSD 网站模板免费下载     如今,几乎每家公司都有自己的企业网站,用于展现公司的专业形象,向客户准确的传递公司的产品和品牌。
2125 0
|
前端开发
(css必看)禁止用户拖动,禁止选中复制,禁止输入框输入
(css必看)禁止用户拖动,禁止选中复制,禁止输入框输入
757 1
|
SQL Oracle 关系型数据库
ORA-01033: ORACLE initialization or shutdown in progress的两种解决方法
ORA-01033: ORACLE initialization or shutdown in progress通常是由于ORACLE数据库文件损坏引起的,以下是出现的问题及解决方法: 现象一: sysdba可以登录,但是在使用中就出现“数据库未打开,仅允许在固定表/视图中查询”,而normal用户无法登录使用,出现ORA-01033: ORACLE initialization or shutdown in progress 的错误。
2502 0
聚焦实战技能,剖析底层原理:Netty+Redis+ZooKeeper+高并发实战
移动时代、5G时代、物联网时代的大幕已经开启,它们对于高性能、高并发的开发知识和技术的要求,抬升了Java工程师的学习台阶和面试门槛。
|
Java
无意中发现阿里巴巴Java开发手册「2023最新黄山版」竟然发布了
提起阿里巴巴的《Java开发手册》大家肯定都不陌生,这份手册代表这Alibaba技术团队的集体智慧结晶和内部大佬的经验总结,经历了多次打磨不断的完善,随着市面上各种版本的流出,小编无意中发现了这份【黄山版】。
9031 1

热门文章

最新文章

下一篇
开通oss服务