目录
055:小易的升级之路
小易的升级之路_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
根据题意简单模拟即可,可单独写gcd函数求最大公因数。
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
#include <iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n=0;
int a=0;
int b[N];
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int main()
{
int num=2;
while(num--)
{
cin>>n;
cin>>a;
int ret=a;
for(int i=0;i<n;i++)
{
cin>>b[i];
if(b[i]<=ret)
{
ret+=b[i];
}
else
{
ret+=gcd(ret,b[i]);
}
}
cout<<ret<<endl;
}
return 0;
}
056:礼物的最大价值
礼物的最大价值_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
动态规划-简单路径类dp(线性dp)
1.状态表示:
dp[i][j]:走到位置 [i][j] 时,礼物的最大价值。
2.状态转移方程:
状态 dp[i][j] 可由状态 dp[i-1][j] 和 dp[i][j-1] 转化而来,取二者最大值再加上棋盘该位置的礼物值。
3.初始化-填表:
创建dp表时,多加一行多加一列初始化为0,dp表从下标为1开始填表(棋盘是从下标为0开始)以符合状态转移方程的推导。
4.返回值
dp表多加一行多加一列,因此到达棋盘右下角位置时,为dp表的dp[m][n]。要返回结果dp[m][n]。
class Solution {
public:
int dp[210][210]={0};
int maxValue(vector<vector<int> >& grid)
{
int m=grid.size(),n=grid[0].size();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];
}
}
return dp[m][n];
}
};
057:对称之美
题目:
题解:
双指针,left 和 right 分别从字符串数组s的两端开始向中间遍历,当字符串 s[left] 和 s[right] 存在相同字符时,符合回文串的规则,则 left++,right-- 再次判断。直到 left<right 。
#include<iostream>
using namespace std;
int t=0;
int n=0;
string s[100];
bool func(string s1,string s2)
{
for(auto ch1:s1)
{
for(auto ch2:s2)
{
if(ch1==ch2)
{
return true;
}
}
}
return false;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i];
}
int left=0,right=n-1;
while(left<=right)
{
if(func(s[left],s[right]))
{
left++;
right--;
}
else
{
cout<<"No"<<endl;
break;
}
}
if(left>right)
{
cout<<"Yes"<<endl;
}
}
return 0;
}