【算法手记9】OR26 最长回文子串 NC369 [NOIP2002 普及组] 过河卒
🦄个人主页:修修修也
🎏所属专栏:刷题
⚙️操作环境:牛客网
一.OR26 最长回文子串
牛客网题目链接(点击即可跳转):OR26 最长回文子串
题目详情:
本题详情如下图:
题目思路:
本题解题思路如下:
本题思路用中心扩展算法,遍历所有字符,将每个字符作为回文串的中心向外扩展,记录下每次拓展的最长的回文串的长度,最后返回最长的回文串长度即可.但是要考虑回文串的长度是奇数还是偶数,如下图所示:
解题代码:
本题解题代码如下:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A string字符串 * @return int整型 */ int getLongestPalindrome(string A) { // 中心拓展算法 int max_len=0; for(int i=0;i<A.size();i++) { int left,right; for(int j=0;j<2;j++) { left=i-1+j; right=i+1; while(left>=0 && right<A.size() && A[left]==A[right]) { left--; right++; } max_len = max(right-left-1,max_len); } } return max_len; } };
二.NC369 [NOIP2002 普及组] 过河卒
牛客网题目链接(点击即可跳转):NC369 [NOIP2002 普及组] 过河卒
题目详情:
本题详情如下图:
题目思路:
本题解题思路如下:
常规二维dp填表可解,状态转换方程为dp[n][m]=dp[n-1][m]+dp[n][m-1];
填表注意下面四种填表特殊情况:如果是马的控制点,那么dp[i][j]=0,如果是首行,那么dp[i][j]=dp[i][j-1],如果是首列,那么dp[i][j]=dp[i-1][j],如果是dp[0][0]则值填1.
特别注意题目给的马的跳跃点方程后面的条件,也是一定要写入判断中的,不能忘了!否则会多错误计算马的跳跃点.
解题代码:
本题解题代码如下
class Solution { public: int crossRiver(int n, int m, int x, int y) { //求dp方程:dp(n,m)=dp(n-1,m)+dp(n,m-1); //填dp表 long long dp[20][20]={0}; //x+=1; //y+=1; for(int i=0;i<=n;i++) { for(int j=0;j<=m;j++) { if((i!=x&&j!=y&&(abs(i-x)+abs(j-y))==3) || (i==x&&j==y)) { dp[i][j]=0; } else if(i==0 && j==0) { dp[i][j]=1; } else if(i==0) { dp[i][j]=dp[i][j-1]; } else if(j==0) { dp[i][j]=dp[i-1][j]; } else { dp[i][j]=dp[i][j-1]+dp[i-1][j]; } } } return dp[n][m]; } };
结语
说点啥好呢...一切都在慢慢向好发展, 坚持下去, 也就最后一两个月时间就可以得到结果了,加油!