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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

zoj 3640 Help Me Escape 期望DP 简单题 适合记忆化搜索

因为终点不确定,而且范围灰常大,数组根本存不下所有状态,就算存下了,初始化也要浪费不少时间。 所以必须记忆化搜索。 #include #include #include #incl...

2044 递推算法 1.水题(有小坑) 2. DP记忆化搜索

一只小蜜蜂... Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S...
  • hnust_V
  • hnust_V
  • 2016年06月23日 20:58
  • 71

[bzoj1415][Noi2005]聪聪和可可 期望DP+记忆化搜索 & bzoj100题

现实是此岸,成功是彼岸,中间隔着湍急的河流,兴趣便是河上的桥,只要行动就可以通过。...

ACM暑假训练第3场中石油集训题(记忆化搜索,dp,树状数组)

问题 A: Why Did the Cow Cross the Road 时间限制: 1 Sec 内存限制:128 MB 提交: 148 解决: 23 [提交][状态][讨论版] 题目描述 W...

Poj 1088 滑雪 (简单DP + 记忆化搜索)

题目链接:http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K...

poj 1088滑雪(记忆化搜索, dp)

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 92465   Accepted: 34980 De...
  • CillyB
  • CillyB
  • 2016年09月21日 00:08
  • 190

UVA 1331 Minimax Triangulation 最大面积最小的三角剖分(区间dp--记忆化搜索)

大大体题意: 给你一个n 个点的多边形,输入按着沿着边输入(不用排序),要求分成n-2个三角形,使得这n-2个三角形中最大的三角形的面积尽可能小,输出最小面积! 思路: 区间dp思想! 令dp...

poj1179 区间dp(记忆化搜索写法)有巨坑!

http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a p...

hdu4283区间dp 记忆化搜索 区间分化

题意:给你一些人的屌丝值Di,计算总屌丝值=sum((k-1)*Di),k为第i个人进入的位置。给你一个栈,可以使人的位置改变。 方法一:记忆化搜索 dp[i][j][k]表示区间[i,j]第i个...

洛谷 1514 引水入城(记忆化搜索+DP)

*PS:做的时候还以为纯搜索,后来发现竟然有DP??exm?调了好长时间,从此dp一生黑(假的)QwQ。 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2018链家编程题-音乐列表(记忆化搜索DP)
举报原因:
原因补充:

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