目录
1.牛牛的快递
算法思路: 这是一道非常简单的模拟题目,不多做介绍,扩展两个库函数,ceil()向上取整,floor()向下取整。
2.最小花费爬楼梯
这是一道简单的动态规划的题目
算法思路:
这道题让我们求第到达楼顶(数组结尾)最小花费,将问题转化到达i位置最小的花费。
dp[i]:表示到i位置的最小花费。
cost[i]:表示i位置的花费。
dp[i]是有两种情况的,一种是 走一步 从dp[i-1] + cost[i-1] ,第二种是 走两步 dp[i-2] + cost[i-2]。
dp[i] = min(dp[i-1] + cost[i-1] , dp[i-2] + cost[i-2]);
注意:[2, 5 ,20],5向后走两步到达楼梯顶。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
vector<int> cost;
vector<int> dp;
dp.resize(n+1);
cost.resize(n+1);
for(int i = 0; i < n; i++) cin >> cost[i];
dp[0] = 0;
dp[1] = 0;
for(int j = 2; j <= n; j++)
{
dp[j] = min(dp[j-1] + cost[j-1], dp[j-2] + cost[j-2]);
}
cout << dp[n] << endl;
return 0;
}
3.两个字符串的最小距离
算法思路:
暴力解法,先找到QWER(或者666),再向后便利去找666(或者QWER)两层for循环即可,会超时。
优化解法:只需要两个变量记录QWER和666上一次出现的位置
prev1 = QWER上一次出现的位置
prev2 = 666上一次出现的位置
当便利到strs[i] = 666时,i - prev1就是距离,只需要维护一个最小值即可。
#include <iostream>
using namespace std;
int main()
{
int n = 0;
string str1, str2;
cin >> n;
cin >> str1 >> str2;
int prev1 = -1, prev2 = -1;
string s;
int ret = 1e6;
for (int i = 0; i < n ;i++)
{
cin >> s;
if (s == str1)
{
if (prev2 != -1)
{
ret = min(ret, i - prev2);
}
prev1 = i;
}
else if (s == str2)
{
if (prev1 != -1) {
ret = min(ret , i - prev1);
}
prev2 = i;
}
}
if (ret == 1e6) {
cout << -1 << endl;
}
else {
cout << ret << endl;
}
return 0;
}