第一次参加leetcode竞赛,好吧我是真菜
数青蛙
题目描述
给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
注意:要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。
如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成,请返回 -1 。
思路
想半天的题竟然这么简单??
思路就很简单,就是遍历发现后面的字符出现的次数大于前面的了,就返回-1,然后等到’k’字符就消消乐。青蛙的个数就是剩下的’c’字符数目。
代码
class Solution {
public:
int minNumberOfFrogs(string s) {
int c=0,r=0,o=0,a=0,k=0;
int maxi = 0;
for(char x:s)
{
if(x=='c')
c++;
else if(x=='r')
r++;
else if(x=='o')
o++;
else if(x=='a')
a++;
else if(x=='k')
k++;
else return -1;
if(r>c||o>r||a>o||k>a)
return -1;
if(k==1)
{
c--;
r--;
o--;
a--;
k--;
}
maxi = max(maxi,c);
}
if(c)
return -1;
return maxi;
}
};
生成数组
题目描述
思路
就一个三维dp,dp[n][i][k]表示在数组长度为n,数组最大值为i,search_cost=k情况下的生成数组数目。易知dp[1][i][1]=1。对于任意p,q,r,dp[p][q][r]可由两个部分相加得到,一是最大值q放在数组末尾,这种情况下的生成数组数目为sum(dp[p-1][j][r-1]),j从1到q-1。然后是最大值q放在数组前n-1的任意位置,这种情况下生成数组的数目为q*dp[p-1][q][r]。
代码
const long long MOD = 1e9+7;
class Solution {
public:
int numOfArrays(int n, int m, int k) {
long long dp[60][110][60];
for(int i=1;i<=m;i++)
{
dp[1][i][1] = 1;
}
for(int p=2;p<=n;p++)
{
for(int q=1;q<=m;q++)
{
for(int r=1;r<=p&&r<=k;r++)
{
dp[p][q][r] = (q*dp[p-1][q][r])%MOD;
for(int j=1;j<=q-1;j++)
{
dp[p][q][r]+=dp[p-1][j][r-1];
dp[p][q][r] %= MOD;
}
}
}
}
long long ans = 0;
for(int i=1;i<=m;i++)
{
ans+=dp[n][i][k];
ans%=MOD;
}
return ans;
}
};