2018链家编程题-音乐列表(记忆化搜索DP)

原创 2017年10月12日 10:16:30

题目描述

  小明喜欢在火车旅行的时候用手机听音乐,他有N首歌在手机里,在整个火车途中,他可以听P首歌,所以他想产生一个播放表产生P首歌曲,这个播放表的规则是:
  (1)每首歌都要至少被播放一次
  (2)在两首一样的歌中间,至少有M首其他的歌
小明在想有多少种不同的播放表可以产生,那么给你N,M,P,你来算一下,输出结果取1000000007的余数

输入

  输入N,M,P
  N范围在1到100
  M范围在0到N
  P范围在N到100

输出

  输出结果mod 1000000007的余数

题解

dp[i][j]表示第i个位置有j种颜色有多少种情况,那么我们可以分为两种情况:

  1. 产生相同的:i这个位置有jm种颜色可以选择来控制相同的元素,那么dp[i][j]=dp[i+1][j](jm)
  2. 产生不相同的:i这个位置就有nj中颜色来使当前颜色与前面的都不相同,那么dp[i][j]=dp[i+1][j+1](nj)

dp[p][n]便为1,记住范围是[0,p1],所以dp[p][n]才为1,可以用dp做,也可以用记忆化搜索

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

typedef long long LL;
const int MAXN = 1e2 + 5;
const int mod = 1e9 + 7;
LL dp[MAXN][MAXN];
int n, m, p;

LL DFS(int i, int j) {
    if (dp[i][j] != -1) return dp[i][j];
    if (i == p) {
        if(j == n) dp[i][j] = 1;
        else dp[i][j] = 0;
        return dp[i][j];
    }
    dp[i][j] = 0;
    if (j > m) {
        dp[i][j] = (DFS(i + 1, j) % mod) * (j - m) % mod;
    }
    dp[i][j] = (dp[i][j] + (DFS(i + 1, j + 1) % mod) * (n - j) % mod) % mod;
    dp[i][j] %= mod;
    return dp[i][j];
}
int main() {
    while(~scanf("%d%d%d", &n, &m, &p)) {
        memset(dp, -1, sizeof(dp));
        printf("%lld", DFS(0, 0));
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

2018链家笔试编程题

解题思路:记录每一组的编号上界,从左侧开始搜寻,如果小于或等于某组的边界,就是在该组。#include #include using namespace std; int main() { i...
  • u012124634
  • u012124634
  • 2017年08月19日 21:52
  • 501

链家在线测评编程题

我感觉这就是简单的二分查找就行了,因为区间编号是有序了的啊,但是不能直接套二分查找,需要找出每个区间的的范围,然后修改判断条件就行了,代码如下:// Lianjia01.cpp : 定义控制台应用程序...
  • vonmax007
  • vonmax007
  • 2017年08月19日 20:51
  • 363

链家编程题

题目是这样的,一个序列上有n个整数,现在你要取m个,且这m个数的任意两个不能相隔的太近,否则这样会太丑,现在问你最大能得到多大的和输入: 第一行三个数n,m,k,分别表示n个数,取m个...
  • shuidinaozhongyan
  • shuidinaozhongyan
  • 2017年08月21日 20:47
  • 314

记忆化搜索(搜索+dp思想)

一:简介 (1)记忆化搜索 即 搜索+动态规划数组记录上一层计算结果,避免过多的重复计算 算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存;一般说来,动态规划...
  • u010700335
  • u010700335
  • 2015年03月08日 20:38
  • 1600

DP动态规划与记忆化搜索的联系与区别

之前遇到好几个不会做的DP题,请教小伙伴,xi
  • u011639256
  • u011639256
  • 2014年06月08日 20:27
  • 2763

专访吕毅:链家网技术架构的演进之路

链家网虽然成立于2010年,但是其技术团队却于2014年正式创立。此前技术开发采用的是传统模式,每个业务都会单独地重新开发,不仅造成各个模块孤立,并且开发人力投入成本巨大。鉴于互联网时代企业业务发展迅...
  • xcw931924821
  • xcw931924821
  • 2016年09月08日 22:12
  • 2309

2017年链家校招前端面试题

链家2017年前端面试
  • datou0529
  • datou0529
  • 2016年10月26日 19:03
  • 1680

链家大数据使用到的机器学习算法

摘自: InfoQ对链家网大数据架构师蔡白银的访谈 InfoQ:房地产数据挖掘会用到哪些算法? 蔡白银:房产领域的数据挖掘用到的算法和平常大家用到的算法并不会有什么类别的不同,只是数据挖掘本身...
  • ziyubiti
  • ziyubiti
  • 2016年09月28日 16:20
  • 1030

链家笔试题整理

1.撤销操作如何实现?撤销功能的实现备忘录模式2.1000万个数找出两数之和为K的数用HashMap实现,key为 具体的数字,value为数字出现的次数3.一个含有n个元素的数组,找出m个数使其和为...
  • xiaomingdetianxia
  • xiaomingdetianxia
  • 2017年08月27日 09:59
  • 1042

scrapy实战(一)-------------爬取链家网的二手房信息

主要是通过scrapy爬取二手房相关信息,只关心ershoufang相关链接,源码地址: https://github.com/happyAnger6/scrapy_tutorials...
  • happyAnger6
  • happyAnger6
  • 2016年07月17日 23:27
  • 3949
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2018链家编程题-音乐列表(记忆化搜索DP)
举报原因:
原因补充:

(最多只允许输入30个字)