9.28金山笔试题解

分析题解攒人品~求池子里的ocococococ😭😭😭

主要是说下第三题吧

题意:给两个字符串AB,求生成的新字符串的最长回文子串长度,生成的规则是AB字符串任意拼接生成C,只要保证A是C的子序列,B是C的子序列即可。AB长度<=50

思路:设dp[i][j][l][r],表示使用A的[i,j]区间B的[l,r]区间,能构造出的最长回文字符串长度

类似区间dp吧,代码更直观一点

#include <iostream>
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
const int N = 60;
int f[N][N][N][N];
void solve(){
    memset(f, 0, sizeof(f));
    string s1,s2;
    cin >> s1 >> s2;
    int n = s1.size();
    int m = s2.size();
    s1 = ' ' + s1;
    s2 = ' ' + s2;
    for(int i=1; i<=n; i++){
        for(int j=1;j<=m+1;j++){
            f[i][i][j][j-1] = 1;
        }
    }

    for(int i=1; i<=m; i++){
        for(int j=0;j<=n+1;j++){
            for(int k=0;k<=n+1;k++){
                if(j==k and j and j<=n and s1[j] == s2[i]){
                    f[j][k][i][i] = 2;
                }
                else {
                    if(k==j-1)
                        f[j][k][i][i] = 1;
                }
            }
        }
    }
    for(int len1=0; len1<=n; len1++){
        for(int len2=0; len2<=m; len2++){
            for(int i=1,j=len1; j<=n; i++, j++){
                for(int l=1,r=len2; r<=m; l++,r++){
                    if(!f[i][j][l][r] and (len1!=0 or len2!=0)) continue;
                    if(i-1 >= 1 and j+1 <=n and s1[i-1] == s1[j+1])
                        f[i-1][j+1][l][r] = max(f[i][j][l][r]+2, f[i-1][j+1][l][r]);
                    if(i-1 >= 1 and r+1 <=m and s1[i-1] == s2[r+1])
                        f[i-1][j][l][r+1] = max(f[i][j][l][r]+2, f[i-1][j][l][r+1]);
                    if(l-1 >= 1 and j+1 <=n and s2[l-1] == s1[j+1])
                        f[i][j+1][l-1][r] = max(f[i][j][l][r]+2, f[i][j+1][l-1][r]);
                    if(l-1 >= 1 and r+1 <=m and s2[l-1] == s2[r+1])
                        f[i][j][l-1][r+1] = max(f[i][j][l][r]+2, f[i][j][l-1][r+1]);
                }
            }
        }
    }
    int ans = 0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            for(int l=1;l<=m;l++){
                for(int r=1;r<=m;r++){
                    ans = max(ans, f[i][j][l][r]);
                }
            }
        }
    }
    cout << ans << endl;
}
signed main() {
    int T;cin>>T;
    while(T--){
        solve();
    }
}

全部评论
佬,第二题有不超时的思路吗,使用动规超时
点赞 回复
分享
发布于 2023-09-28 22:08 上海

相关推荐

#软件开发2024笔面经#&nbsp;没事干写个面经吧,之前其它公司的面经&nbsp;太碎了就没写#腾讯##阿里##美团#(引流)1.&nbsp;自我介绍2.&nbsp;浏览器输入URL会发生什么3.&nbsp;第一次渲染和第二次渲染怎么做优化?4.&nbsp;场景:点赞功能,用户在短时间内多次点击怎么做,可能有偶数次或者奇数次(奇数点赞,偶数取消)的情况怎么保证页面性能5.&nbsp;TCP和UDP的区别6.&nbsp;React中组件间通信的方式7.&nbsp;React中合成事件和普通事件?为什么要有合成事件8.&nbsp;React中UI怎能够快速渲染的?或者说UI挂载流程9.&nbsp;做过什么跟前端安全相关的工作嘛?10.&nbsp;加密和签名区别11.&nbsp;XSS跨站脚本攻击是什么?怎么防止跨站脚本攻击12.&nbsp;场景:对象里有a、b、c、d四个属性,当a属性被修改时,需要联动的修改c、d两个属性,应该怎么做?13.&nbsp;场景:实现两行两列14.&nbsp;弹性布局里面,flex:1是哪些参数的缩写?都表示什么意思15.&nbsp;同源策略是什么?CORS设计到的参数有哪些?16.&nbsp;ES6中你知道哪些数据结构?17.&nbsp;map和set的区别?以及map的key值可以是什么18.&nbsp;weakSet和Set有什么区别?19.&nbsp;Vue的双向绑定的原理20.&nbsp;浏览器事件循环21.&nbsp;有没有接触过Node22.&nbsp;浏览器缓存23.&nbsp;怎么不做缓存?前端这块怎么实现?24.&nbsp;箭头函数的特点25.&nbsp;HTTP2和HTTP3新增了哪些功能26.&nbsp;websocket是什么?&nbsp;它的应用场景是什么27.&nbsp;CSS动画&nbsp;&nbsp;怎么实现一个位置到另一个位置的移动?动画怎么设置不循环播放?28.&nbsp;defineProperty中定义的属性有什么性质?29.&nbsp;JS原型链&nbsp;&nbsp;&nbsp;怎么给Array原型数组添加方法30.&nbsp;ESModule中的import怎么实现同步加载效果?
点赞 评论 收藏
转发
1 10 评论
分享
牛客网
牛客企业服务