解题报告-美团点评2017秋招笔试编程题--常见动态规划问题

晚上就要美团笔试了,在牛客上刷套美团的题练练手,四道题目全都是典型题目,经典的连题面都懒得改那种,也都不难,很基础的动态规划问题。

[编程题] 大富翁游戏

时间限制:1秒

空间限制:32768K

大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。 
输入描述:
输入包括一个整数n,(1 ≤ n ≤ 6)


输出描述:
输出一个整数,表示投骰子的方法

输入例子1:
6

输出例子1:
32
水题,最常见的dp,等于走台阶
#include 
#include 
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<

[编程题] 拼凑钱币

给你六种面额 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 
#include 
#include 
#include 
#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]){
                dp[i][j]+=dp[i-1][j];
                dp[i][j]+=dp[i][j-v[i]];
            }
            else{
                dp[i][j]+=dp[i-1][j];
            }
        }
    }
    cout<
[编程题] 最大矩形面积

时间限制:1秒

空间限制:32768K

给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
解题报告-美团点评2017秋招笔试编程题--常见动态规划问题_第1张图片

输入描述:
输入包括两行,第一行包含一个整数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 
#include 
#include 
#include 
#include 
#include 
#define LL long long
using namespace std;
int largestRectangleArea(vector& height) {
    int len = height.size();
    height.push_back(0);
    stack 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 h;
int n;
int main(){
    int p;
    cin>>n;
    for(int i=0;i>p;
        h.push_back(p);
    }
    cout<
[编程题] 最长公共连续子串

时间限制:1秒

空间限制:32768K

给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。 
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.


输出描述:
输出为一个整数,表示最长公共连续子串的长度。

输入例子1:
abcde
abgde

输出例子1:
2

更没啥好说的。。。。

#include 
#include 
#include 
#include 
#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;i0&&j>0){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=1;
                }
                if(max_len

你可能感兴趣的:(笔试)