利用最大公约数求最小公倍数
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
long long a,b;
cin>>a>>b;
long long ans=gcd(a,b);
cout<<(a*b)/ans<<endl;
return 0;
}
排序遍历,记录连续最大值即可,注意处理相同的情况
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* max increasing subsequence
* @param arr int整型vector the array
* @return int整型
*/
int MLS(vector<int>& arr) {
// write code here
int cnt=0;
sort(arr.begin(),arr.end());
int j=1;
for(int i=1;i<arr.size();i++)
{
if(arr[i]==arr[i-1])
continue;
if(arr[i]-arr[i-1]==1)
j++;
else
{
cnt=max(cnt,j);
j=1;
}
}
cnt=max(j,cnt);
return cnt;
}
};
这道题首先想到dfs暴力,但是数据较大会超时,所以使用动态规划来进行优化。
先预处理第一行和第一列;
然后很容易得到状态转移方程
f[i][j]=f[i-1][j]+fun(i,j)
f[i][j]=max(f[i][j],f[i][j-1]+fun(i,j))
#include <iostream>
#include<cstring>
using namespace std;
const int N =510;
char a[N][N];
int f[N][N];
int n,m;
int cnt;
int fun(int x,int y)
{
if(a[x][y]=='l')
return 4;
else if(a[x][y]=='o')
return 3;
else if(a[x][y]=='v')
return 2;
else if(a[x][y]=='e')
return 1;
else
return 0;
}
int main()
{
cin>>n>>m;
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cin>>a[i][j];
getchar();
}
f[0][0]=fun(0,0);
for(int i=1;i<n;i++)
{
f[i][0]=f[i-1][0]+fun(i,0);
}
for(int i=1;i<m;i++)
f[0][i]=f[0][i-1]+fun(0,i);
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
{
f[i][j]=f[i-1][j]+fun(i,j);
f[i][j]=max(f[i][j],f[i][j-1]+fun(i,j));
}
cout<<f[n-1][m-1]<<endl;
return 0;
}