昨天去听棱镜乐队了,真是顶级浪漫啊,然后就没做题hhh,今天先给动态规划结个尾,看看要不要做单调栈。
647. 回文子串
定义从i到j是不是回文,这个需要想一想。
其次就是i要做倒序遍历。因为dp[i][j]要去看他的左下角dp[i+1][j-1]
#include <iostream>
#include <string>
#include <vector>
using namespace ::std;
class Solution
{
public:
int countSubstrings(string s)
{
vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));
int result = 0;
// 从i到j是不是回文
for (int i = 0; i < s.size(); i++)
{
dp[i][i] = 1;
}
for (int i = s.size() - 1; i >= 0; i--)
{
for (int j = i; j < s.size(); j++)
{
if (s[i] == s[j])
{
if (j - i <= 1)
{
dp[i][j] = 1;
result++;
}
else
{
dp[i][j] = dp[i + 1][j - 1];
result += dp[i][j];
}
}
}
}
for (int i = 0; i < s.size(); i++)
{
for (int j = 0; j < s.size(); j++)
{
cout << dp[i][j] << ' ';
}
cout << endl;
}
return result;
}
};
int main()
{
Solution syz;
string text1 = "aabaa";
syz.countSubstrings(text1);
return 0;
}
516.最长回文子序列
这题被扶出来的,我记得有个题需要考虑单双啊。是哪个来着??
这题要谨记方向
class Solution {
public:
int longestPalindromeSubseq(string s) {
//dp[i][j]表示从i到j的回文长度
vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));
for(int i = 0;i< s.size();i++){
dp[i][i] = 1;
}
for(int i = s.size()-1;i >=0 ;i--){
for(int j = i+1;j < s.size();j++){
if(s[i] == s[j]){
dp[i][j] = dp[i+1][j-1] + 2;
}else{
dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
}
}
}
return dp[0][s.size()-1];
}
};