笔试练习day10


感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录
🏀🏀🏀 笔试练习题

OR26 最长回文子串(需要重做)

链接
在这里插入图片描述

题目解析

这道题中的子串表示字符串A连续的一部分,子串是对称的
方法一:动态规划 时间复杂度n^2 空间复杂度:n^2
方法二:马拉车算法 时间复杂度n 空间复杂度:n
方法三:中心扩展算法 时间复杂度n^2 空间复杂度:1
这种方法就是每次以一个数为中心点,向两边扩散
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是有一点需要考虑,就是回文子串长度为偶数的情况
在这里插入图片描述

代码

方法三
class Solution {
public:
    int getLongestPalindrome(string A) {
int n=A.size(),ret=0;
for(int i=0;i<n;i++)
{
    int left=i-1,right=i+1;//回文子串为奇数的情况
    while (left>=0&&right<n&&A[left]==A[right]) //考虑边界的情况
    {
    left--;
    right++;
    }
    ret=max(ret,right-left-1);
    left=i,right=i+1;//回文子串为偶数的情况
      while (left>=0&&right<n&&A[left]==A[right]) 
    {
    left--;
    right++;
    }
     ret=max(ret,right-left-1);
}
return ret;
    }
};

DP30 买卖股票的最好时机(一)(需要重做)

链接
在这里插入图片描述

题目解析

方法一:贪心
因为暴力解法用两层for循环会导致超时,而贪心是在暴力解法的基础上进行优化在这里插入图片描述
其实就是用一个prevmin表示当前位置之前的最小值,比如当前位置是7,那么7之前的最小值是2,而如果在当前位置卖掉的话那么就会获利5元
方法二:动态规划

代码

#include <iostream>
using namespace std;
const int N=1e5 + 10;
int n;
int arr[N];
int main() {
cin>>n;
for(int i=0;i<n;i++)cin>>arr[i];
int ret=0,prevmin=arr[0];
for(int i=1;i<n;i++)
{
    ret=max(ret,arr[i]-prevmin);
    prevmin=min(arr[i],prevmin);
}
cout<<(ret<0?0:ret)<<endl;//如果ret为负数,那么就不卖
return 0;
}

DP13 [NOIP2002 普及组] 过河卒(需要重做)

链接
在这里插入图片描述

题目解析

这道题要注意,马不是一直都可以跳,而是只能跳一步,并且马的控制点包括最开始的C点和所有一步能够跳跃到的点
这道题需要用到的解法是动态规划
dp[i][j]表示从[0,0]到[i],[j]处一共有多少种方法
dp[i][j]=dp [i-1] [j]+ dp [ i ] [ j -1] (注意如果这里面可能有马能跳到的位置,当[i-1,j]是马能跳到的位置,那么dp[i-1][j]=0)

然后我们在初始化dp数组的时候可以多一行和多一列,这样方便初始化
为了不违反dp[i][j]=dp [i-1] [j]+ dp [ i ] [ j -1]这个公式,我们需要在多加的一行和一列种让dp[0][1]或者dp[1][0]种任意一个为1,另一个为0

代码

#include <iostream>
using namespace std;
int n, m, x, y;
long long dp[25][25];
int main() {
    cin >> n >> m >> x >> y;
    x += 1;
    y += 1;
    dp[0][1] = 1;
    for (int i = 1; i <= n + 1; i++) {
        for (int j = 1; j <= m + 1; j++) {
            if (i != x && j != y && abs(i - x) + abs(j - y) == 3 || (i == x && j == y)) {
                dp[i][j] == 0;
            } else {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
    }
    cout << dp[n + 1][m + 1] << endl;
    return 0;
}

代码解析

long long dp[25][25]因为这里面是记录的路线,而这个路线的数字可能很大,所以用的long long
x += 1和 y += 1是为了找到对应的映射关系,因为我们将这个二维数组的行和列都扩展了
if (i != x && j != y && abs(i - x) + abs(j - y) == 3 || (i == x && j == y))就是利用题目种告诉的关系式判断是否为马能跳到的点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值