NO.1
思路:中心扩展。从i位置开始,从i-1为左边和i+1右边进行移动,字符相等就继续移动,直到不等,更新回文串长度,让i为左边,i+1右边再移动,同样字符相等就移动,不等就更新长度。
代码实现:
class Solution {
public:
int getLongestPalindrome(string A) {
int n=A.size();
int ret=0;
for(int i=0;i<n;i++)
{
int left=i-1,right=i+1;
while(left>=0&&right<n&&A[left]==A[right])
{
left--;
right++;
}
ret=max(ret,right-left-1);
left=i,right=i+1;
while(left>=0&&right<n&&A[left]==A[right])
{
left--;
right++;
}
ret=max(ret,right-left-1);
}
return ret;
}
};
NO.2
思路:定义一个前驱最小值,最大利润等于当前值减去前去最小值,前驱最小值等于当前值和它前驱最小值的最小值,利用一个循环遍历一遍就可以实现。
代码实现:
#include <iostream>
using namespace std;
const int N=1e5+10;
int n;
int arr[N];
int main() {
cin>>n;
for(int i=0;i<n;i++) cin>>arr[i];
int ret=0,prevmin=arr[0];
for(int i=1;i<n;i++)
{
ret=max(ret,arr[i]-prevmin);
prevmin=min(prevmin,arr[i]);
}
cout<<(ret<0?0:ret)<<endl;
}
如果不想最后判断的话,最后调换一下ret和prevmin的最小值的顺序的就可以了。
#include <iostream>
using namespace std;
const int N=1e5+10;
int n;
int arr[N];
int main() {
cin>>n;
for(int i=0;i<n;i++) cin>>arr[i];
int ret=0,prevmin=arr[0];
for(int i=1;i<n;i++)
{
prevmin=min(prevmin,arr[i]);
ret=max(ret,arr[i]-prevmin);
}
cout<<ret<<endl;
}
NO.3
思路:dp路径问题,分情况讨论,如果要走的点为马控制的点或马本身的点,那么dp[i][j]为0,否则dp[i][j]=dp[i][j-1]+dp[i-1][j],因为我们多开辟一行一列,所以初始化初始化的时候先x+1,y+1,保证能够关系映射,并且令dp[0][1]或者是dp[1][0]为1。
#include <iostream>
using namespace std;
int n,m,x,y;
long long dp[25][25];
int main() {
cin>>n>>m>>x>>y;
x+=1;y+=1;
dp[0][1]=1;
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=m+1;j++)
{
if(i!=x&&j!=y&&abs(i-x)+abs(j-y)==3||(i==x&&j==y))
{
dp[i][j]=0;
}
else {
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
}
cout<<dp[n+1][m+1]<<endl;
return 0;
}