• 【笔试强训】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的复杂度,但是我忘了,草。

    代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. class Solution {
    3. public:
    4. int getLongestPalindrome(string A) {
    5. int n = A.size();
    6. vectorbool>> dp(n + 1, vector<bool>(n + 1));
    7. if (A.size() == 1)return 1;
    8. for (int i = 1; i <= n; i++) {
    9. dp[i][i] = true;
    10. }
    11. int ans = 1;
    12. for (int len = 1; len <= n; len++) {
    13. for (int l = 1; l + len - 1 <= n; l++) {
    14. int r = l + len - 1;
    15. if (len == 1)continue;
    16. if (A[l - 1] != A[r - 1]) {
    17. dp[l][r] = false;
    18. }
    19. else {
    20. if (len <= 3)dp[l][r] = true;
    21. else dp[l][r] = dp[l + 1][r - 1];
    22. }
    23. if (dp[l][r])ans = max(ans, r - l + 1);
    24. }
    25. }
    26. return ans;
    27. }
    28. };

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

    思路:

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

    代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. using namespace std;
    4. const int N = 1e5 + 10;
    5. int a[N];
    6. int s[N];
    7. int main() {
    8. int n;
    9. cin >> n;
    10. for (int i = 1; i <= n; i++) {
    11. cin >> a[i];
    12. }
    13. s[n] = a[n];
    14. for (int i = n - 1; i >= 1; i--) {
    15. s[i] = max(s[i + 1], a[i]);
    16. }
    17. int ans = 0;
    18. for (int i = 1; i < n; i++) {
    19. ans = max(ans, s[i + 1] - a[i]);
    20. }
    21. cout << ans;
    22. return 0;
    23. }

    3.过河卒

    思路:

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

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

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

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

    代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = 50;
    6. long long f[N][N];
    7. bool st[N][N];
    8. int n, m, x, y;
    9. int dx[] = { 0, -2, -1, 1, 2, 2, 1, -1, -2 };
    10. int dy[] = { 0, 1, 2, 2, 1, -1, -2, -2, -1 };
    11. bool check(int a, int b) {
    12. if (x == a && y == b)return false;
    13. if (abs(a - x) + abs(b - y) == 3) {
    14. return false;
    15. }
    16. // cout<
    17. return true;
    18. }
    19. int main() {
    20. int n, m, x, y;
    21. cin >> n >> m >> x >> y;
    22. if (n == x && m == y) {
    23. cout << 0 << endl;
    24. return 0;
    25. }
    26. for (int i = 0; i < 9; i++) {
    27. int a = x + dx[i];
    28. int b = y + dy[i];
    29. if (a >= 0 && a <= n && b >= 0 && b <= m)st[a][b] = true;
    30. }
    31. for (int i = 1; i <= m; i++) {
    32. if (st[0][i]) {
    33. break;
    34. }
    35. f[0][i] = 1;
    36. //cout<
    37. }
    38. for (int i = 1; i <= n; i++) {
    39. if (st[i][0]) {
    40. break;
    41. }
    42. f[i][0] = 1;
    43. //cout<
    44. }
    45. f[0][0] = 1;
    46. for (int i = 1; i <= n; i++) {
    47. for (int j = 1; j <= m; j++) {
    48. if (st[i][j])continue;
    49. if (!st[i - 1][j])f[i][j] += f[i - 1][j];
    50. if (!st[i][j - 1])f[i][j] += f[i][j - 1];
    51. // cout<
    52. }
    53. //cout<
    54. }
    55. cout << f[n][m] << endl;
    56. return 0;
    57. }

  • 相关阅读:
    企业移动设备管理(MDM)概述
    ChatGPT简介及基本概念
    《C++ 并发编程实战 第二版》前 4 章 标准库工具及其使用:思维导图
    尚硅谷周阳老师 SpringCloud第二季学习笔记
    解决动态菜单router的index配置,以及第二次传参未响应情况
    (十二)判断Python中变量是否是函数
    mathtype在word内的简单使用
    学习node.js & WS&服务器设置SFTP
    论文复现笔记
    Android学习之路(14) AMS与PMS详解
  • 原文地址:https://blog.csdn.net/qq_62987647/article/details/138172635