利用最大公约数求最小公倍数
#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 hereint 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;elsereturn 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;
}