感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 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))就是利用题目种告诉的关系式判断是否为马能跳到的点