牛客 合并回文子串 最长回文子串 最长回文子序列
题目链接:https://ac.nowcoder.com/acm/problem/13230
思路: 区间dp 只有四种情况 讨论 注意处理边界问题 把0的处理好后 1的也好了 2的不用处理 因为不同于单个字符串
https://ac.nowcoder.com/discuss/391086 题解
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 using namespace std; 5 const int maxn=1e5+10; 6 const int mod=1e9+7; 7 int dp[55][55][55][55]; 8 9 10 int main() 11 { 12 ios::sync_with_stdio(0); 13 cin.tie(0); 14 int t; 15 cin>>t; 16 while(t--) 17 { 18 string a,b; 19 cin>>a>>b; 20 memset(dp,0,sizeof(dp)); 21 int na=a.size(),nb=b.size(); 22 int ans=1; 23 for(int lena=0;lena<=na;lena++) 24 { 25 for(int lenb=0;lenb<=nb;lenb++) 26 { 27 for(int i=1;i+lena-1<=na;i++) 28 { 29 for(int x=1;x+lenb-1<=nb;x++) 30 { 31 int j=i+lena-1,y=x+lenb-1; 32 if(lena+lenb<=1) 33 { 34 dp[i][j][x][y]=1; 35 continue; 36 } 37 if(a[i-1]==a[j-1]&&dp[i+1][j-1][x][y]&&lena>1) 38 dp[i][j][x][y]=1; 39 if(a[i-1]==b[y-1]&&dp[i+1][j][x][y-1]&&lena&&lenb) 40 dp[i][j][x][y]=1; 41 if(b[x-1]==a[j-1]&&dp[i][j-1][x+1][y]&&lena&&lenb) 42 dp[i][j][x][y]=1; 43 if(b[x-1]==b[y-1]&&dp[i][j][x+1][y-1]&&lenb>1) 44 dp[i][j][x][y]=1; 45 if(dp[i][j][x][y]) 46 ans=max(ans,lena+lenb); 47 } 48 } 49 } 50 } 51 cout<<ans<<'\n'; 52 } 53 54 55 56 }
最长回文子串 n^2 ###K //K
1 // 最长回文子串 n^2 2 class Solution { 3 public: 4 int dp[1111][1111]; 5 string longestPalindrome(string s) { 6 int n=s.size(); 7 for(int i=1;i<=n;i++) 8 dp[i][i]=1; 9 int max1=1,p=0; 10 for(int len=2;len<=n;len++) 11 { 12 for(int i=1;i+len-1<=n;i++) 13 { 14 int endx=i+len-1; 15 if(s[i-1]==s[endx-1]&&(dp[i+1][endx-1]||len==2))//特判长度2的 16 dp[i][endx]=1; 17 if(dp[i][endx]) 18 { 19 if(len>max1) 20 { 21 max1=len; 22 p=i-1; 23 } 24 } 25 } 26 } 27 return s.substr(p,max1); 28 } 29 };
最长回文子序列 n^2 ###K //K
1 // 最长回文子序列 2 class Solution { 3 public: 4 int dp[1111][1111]; 5 int longestPalindromeSubseq(string s) { 6 int n=s.size(); 7 for(int i=1;i<=n;i++) 8 dp[i][i]=1;//记得初始化 9 for(int len=2;len<=n;len++) 10 { 11 for(int i=1;i+len-1<=n;i++) 12 { 13 int endx=i+len-1; 14 if(s[i-1]==s[endx-1]) 15 dp[i][endx]=dp[i+1][endx-1]+2; 16 else 17 dp[i][endx]=max(dp[i+1][endx],dp[i][endx-1]); 18 } 19 } 20 return dp[1][n]; 21 22 } 23 };

浙公网安备 33010602011771号