目录
1.最长回文子串
2.买卖股票的最好时机(一)
3.过河卒
1.最长回文子串
最长回文子串_牛客题霸_牛客网
算法思路:
使用中心扩散算法,枚举所有的中点,向两边扩散,一个中点需要枚举两次,一次当回文串是奇数另一次回文串是偶数的情况。
class Solution {
public:
int getLongestPalindrome(string A)
{
int n = A.size();
int ret = 1;// 特殊处理 只有一个字符的情况
for(int i = 1; i < n; i++)
{
//当回文字串是偶数时
int left = i - 1;
int right = i;
while(left >= 0 && right < n && A[left] == A[right])
{
ret = max(ret, right - left + 1);
left--;
right++;
}
//奇数情况
left = i - 1;
right = i + 1;
while (left >= 0 && right < n && A[left] == A[right])
{
ret = max(ret, right -left + 1);
left--;
right++;
}
}
return ret;
}
};
2.买卖股票的最好时机(一)
买卖股票的最好时机(一)_牛客题霸_牛客网
算法思路:
遍历整个数组维护一个最小值,(用遍历的当前元素 - 最小值)的最大值就是卖股票的最大利润。
最小值是当前遍历位置之前的最小值,这样就可以保证,买在卖的前面。
#include <climits>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
vector<int> price(n);
int Min = INT_MAX;
int ret = 0;
for(int i = 0; i < n; i++)
{
cin >> price[i];
}
for(int i = 0; i < n; i++)
{
ret = max(ret, price[i] - Min);
Min = min(Min, price[i]);
}
cout << ret << endl;
return 0;
}
3.过河卒
[NOIP2002 普及组] 过河卒_牛客题霸_牛客网
算法思路:
这是一道动态规划的问题。
1.状态分析:dp[n][m] 表示n,m位置路径总数。
2.状态转移方程:分析最后一步,到达n,m位置只有两种情况 {n-1,m}和{n, m-1}
dp[n][m] = dp[n-1][m] + dp[n][m-1]
3.注意:为了方便初始化,要多填一行x,y
#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 - 1][j] + dp[i][j - 1];
}
}
}
cout << dp[n + 1][m + 1] << endl;
return 0;
}