晚上就要美团笔试了,在牛客上刷套美团的题练练手,四道题目全都是典型题目,经典的连题面都懒得改那种,也都不难,很基础的动态规划问题。
[编程题] 大富翁游戏
时间限制:1秒
空间限制:32768K
大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。
输入描述:
输入包括一个整数n,(1 ≤ n ≤ 6)
输出描述:
输出一个整数,表示投骰子的方法
输入例子1:
6
输出例子1:
32
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n;
int dp[10];
cin>>n;
for(int i=0;i<=n;i++){
dp[i]=1;
}
dp[1]=1;
dp[2]+=dp[1];
dp[3]+=dp[2];
dp[3]+=dp[1];
dp[4]+=dp[3];
dp[4]+=dp[2];
dp[4]+=dp[1];
dp[5]+=dp[4];
dp[5]+=dp[3];
dp[5]+=dp[2];
dp[5]+=dp[1];
dp[6]+=dp[5];
dp[6]+=dp[4];
dp[6]+=dp[3];
dp[6]+=dp[2];
dp[6]+=dp[1];
cout<<dp[n]<<endl;
return 0;
}
[编程题] 拼凑钱币
给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。
输入描述:
输入包括一个整数n(1 ≤ n ≤ 10000)
输出描述:
输出一个整数,表示不同的组合方案数
输入例子1:
1
输出例子1:
1
典型二维dp,前i种物品取j个(或j价值)的物品,这道题只有六种物品,状态转移如下
if(j>=v[i]){ dp[i][j]+=dp[i-1][j]; dp[i][j]+=dp[i][j-v[i]]; }
else{dp[i][j]+=dp[i-1][j]; }
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
int main(){
int n;
LL dp[10][10100];
int v[10]={1,5,10,20,50,100};
cin>>n;
memset(dp,0,sizeof(dp));
for(int i=0;i<6;i++){
//cout<<v[i]<<endl;
dp[i][0]=1;
}
for(int i=0;i<=n;i++){
dp[0][i]=1;
}
for(int i=1;i<6;i++){
for(int j=1;j<=n;j++){
if(j>=v[i]){
dp[i][j]+=dp[i-1][j];
dp[i][j]+=dp[i][j-v[i]];
}
else{
dp[i][j]+=dp[i-1][j];
}
}
}
cout<<dp[5][n]<<endl;
return 0;
}
[编程题] 最大矩形面积
时间限制:1秒
空间限制:32768K
给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
输入描述:
输入包括两行,第一行包含一个整数n(1 ≤ n ≤ 10000) 第二行包括n个整数,表示h数组中的每个值,h_i(1 ≤ h_i ≤ 1,000,000)
输出描述:
输出一个整数,表示最大的矩阵面积。
输入例子1:
6 2 1 5 6 2 3
输出例子1:
10
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
#include <algorithm>
#define LL long long
using namespace std;
int largestRectangleArea(vector<int>& height) {
int len = height.size();
height.push_back(0);
stack<int> s;
s.push(0);
int ans = 0;
for(int i = 1; i <= len; i ++)
{
while(! s.empty() && height[i] < height[s.top()])
{
int index = s.top();
s.pop();
ans = max(ans, height[index]*(i-1-(s.empty()?-1:s.top())));
};
s.push(i);
};
return ans;
};
vector<int> h;
int n;
int main(){
int p;
cin>>n;
for(int i=0;i<n;i++){
cin>>p;
h.push_back(p);
}
cout<<largestRectangleArea(h)<<endl;
return 0;
}
[编程题] 最长公共连续子串
时间限制:1秒
空间限制:32768K
给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.
输出描述:
输出为一个整数,表示最长公共连续子串的长度。
输入例子1:
abcde abgde
输出例子1:
2
更没啥好说的。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
int main(){
char s1[100];
char s2[100];
int dp[100][100];
int max_len=0;
memset(dp,0,sizeof(dp));
gets(s1);
gets(s2);
for(int i=0;i<strlen(s1);i++){
for(int j=0;j<strlen(s2);j++){
if(s1[i]==s2[j]){
if(i>0&&j>0){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=1;
}
if(max_len<dp[i][j]){
max_len=dp[i][j];
}
}
}
}
printf("%d\n",max_len);
return 0;
}