区间DP

Smiling & Weeping

                    ----你站在桥上看风景,

                      看风景的人在楼上看你。

                      明月装饰了你的窗子,

                      你装饰了别人的梦。

 

题目:

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

题目链接:516. 最长回文子序列 - 力扣(LeetCode)

思路:思路是区间DP,最长回文子序列,若s[i]==s[j] -> dp[i][j] = dp[i+1][j-1]+2,之后就是套路整理:

Talk is cheap , show me the code

 1 class Solution {
 2 public:
 3     int longestPalindromeSubseq(string s) {
 4         int n = s.length();
 5         const int inf = 1000000000;
 6         vector<vector<int>> dp;
 7         dp.resize(n+10);
 8         for(int i = 1; i <= n; i++)
 9             dp[i].resize(n+10);
10         for(int i = 1; i <= n; i++)     dp[i][i] = 1;
11         for(int len =2; len <= n; len++)
12             for(int i = 1; i <= n-len+1; i++)
13             {
14                 int j = i+len-1;
15                 if(s[i-1] == s[j-1]){
16                     dp[i][j] = max(dp[i+1][j-1]+2 , dp[i][j]);
17                 }
18                 else
19                     dp[i][j] = max(dp[i+1][j] , dp[i][j-1]);
20             }
21         return dp[1][n];
22     }
23 };

云朵是汽做的山岚,

山岚是是做的云朵,

时光梦境中的一个幻象。

--在梦中忽然觉得困倦极了,于是便醒了过来。

posted @ 2023-08-08 15:25  smiling&weeping  阅读(10)  评论(0)    收藏  举报