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

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

[编程题] 大富翁游戏

时间限制:1秒

空间限制:32768K

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


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

输入例子1:
6

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

猜你喜欢

转载自blog.csdn.net/q295657451/article/details/80016216