The Debut Album

题目链接:

http://acm.hust.edu.cn/vjudge/contest/126546#problem/G

Description

Pop-group “Pink elephant” entered on recording their debut album. In fact they have only two songs: “My
love” and “I miss you”, but each of them has a large number of remixes.
The producer of the group said that the album should consist of ? remixes. On second thoughts the
musicians decided that the album will be of interest only if there are no more than ? remixes on “My
love” in a row and no more than ? remixes on “I miss you” in a row. Otherwise, there is a risk that even
the most devoted fans won’t listen to the disk up to the end.
How many different variants to record the album of interest from ? remixes exist? A variant is a sequence
of integers 1 and 2, where ones denote remixes on “My love” and twos denote remixes on “I miss you”.
Two variants are considered different if for some ? in one variant at ?-th place stands one and in another
variant at the same place stands two.

Input

The only line contains integers ?, ?, ? (1 ≤ ?, ? ≤ 300; max(?, ?) + 1 ≤ ? ≤ 50 000).

Output

Output the number of different record variants modulo 109 + 7.

Examples

3 2 1
4

Explanation

In the example there are the following record variants: 112, 121, 211, 212.

题意:

英语弱鸡表示题意真难看懂.
在n个位置填充1 or 2. 要求连续的1的个数不超过a,连续的2的个数不超过b.
求方案数.

题解:

要考虑每一位可能放1或2,容易想到动态规划:
dp[i][1/2][j]:到第i个位置时,放1且有连续j个1的方案(放2且有连续j个2的方案).
转移方程:
j==1: dp[i][1][1] = Σdp[i-1][2][k] ,(k<=b), 即只放一个1的情况等同于前面有任意个连续2的情况.
dp[i][2][1] = Σdp[i-1][1][k] ,(k<=a), 即只放一个2的情况等同于前面有任意个连续1的情况.
j!=1: dp[i][1/2][j] = dp[i-1][1/2][j-1];

上述思路确定后,考虑数组内存的问题,由于n比较大,直接开三维数组估计会MLE.
由于转移具有线性型(i只能由i-1来). 所以可以用滚动数组压缩到二维数组.
注意考虑压缩后的各种问题:
如果后面需要的值在前面被改变了,那么就先需要记录下来.
对j进行枚举时,由于j用到j-1的值,所以要从大往小枚举.

一个简单的滚动数组dp写了一个小时,一直在瞎处理边界.
归根结底还是太弱了,dp还需多加练习.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define LL long long
#define eps 1e-8
#define maxn 550
#define mod 1000000007
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;int n, a, b;
int dp[2][350];int main(int argc, char const *argv[])
{//IN;while(scanf("%d %d %d", &n,&a,&b) != EOF){memset(dp, 0, sizeof(dp));dp[0][1] = dp[1][1] = 1;for(int i=2; i<=n; i++) {/*由于要滚动处理,先记录下会改变的值*/int tmpa = dp[0][1];int tmpb = dp[1][1];dp[0][1] = 0;for(int j=1; j<=b; j++)dp[0][1] = (dp[0][1] + dp[1][j]) % mod;dp[1][1] = tmpa;for(int j=2; j<=a; j++)dp[1][1] = (dp[1][1] + dp[0][j]) % mod;/*由于要滚动处理,需要从后往前覆盖*/for(int j=a; j>=3; j--) {dp[0][j] = dp[0][j-1];}if(a >= 2) dp[0][2] = tmpa;for(int j=b; j>=3; j--) {dp[1][j] = dp[1][j-1];}if(b >= 2) dp[1][2] = tmpb;}int ans = 0;for(int i=1; i<=a; i++)ans = (ans + dp[0][i]) % mod;for(int i=1; i<=b; i++)ans = (ans + dp[1][i]) % mod;printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/Sunshine-tcf/p/5746635.html

Gym 100507G The Debut Album (滚动数组dp)相关推荐

  1. 【滚动数组】【状压dp】Gym - 100956F - Colored Path

    f(i,j,S)表示到(i,j),且经由的路径上的颜色集合为S的价值的最小值,从上方和左方转移过来即可. 要注意,内存不足,需要滚动数组优化,即使用了map,还是需要. 路径输出的时候,可以再跑一遍d ...

  2. 洛谷 P2679 子串 【dp神题】【滚动数组】【2015 noip d2t2】

    偷个懒,题解看这里:https://www.luogu.org/problemnew/solution/P2679 看作者 GuessYCB  写的 ===2018.9.6=== 这一次算理解深一点了 ...

  3. HDU 1176 免费馅饼 矩阵取数, dp + 滚动数组

    http://acm.hdu.edu.cn/showproblem.php?pid=1176 首先可以处理出整张地图的状态. book[T][POS]表示第T秒,在第pos个地方有多少个馅饼. dp[ ...

  4. Top Secret Task(dp+滚动数组)

    传送门: 题目 dp[i][j][k] 表示 考虑到第i个数 计算前j个数的和 进行了k次操作 则有 若不把第i个数放入前j个数中 dp[i][j][k] = dp[i-1][j][k] 若把第i个数 ...

  5. dp笔记:关于DP算法和滚动数组优化的思考

    从网上总结了一些dp的套路以及对滚动数组的一些思考,现记录如下,希望以后回顾此类算法时会有所帮助. 目录 1.DP算法经验 1.DP算法核心: 2.DP算法类别以及例题 例1:三步问题 例2:最小路径 ...

  6. HDU 5617 Jam's maze dp+滚动数组

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5617 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

  7. 【牛客 - 188D 】愤怒(01滚动数组优化dp,括号匹配方案个数,tricks)

    题干: 小w很生气 小w有一个长为n的括号序列 愤怒小w想把这个括号序列分为两个括号序列 小w想让分为的这两个括号序列同时合法 小w想知道一共有多少种划分方案 (划分的意思是划分为两个子序列) 注意两 ...

  8. 【NOIP2015提高组】子串 区间DP+滚动数组优化

    题意: 有两个仅包含小写英文字母的字符串 A 和 B. 现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串. 请问 ...

  9. 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP

    传送门1 传送门2 传送门3 写在前面:就我看来,这是一道不错的题 思路: 一.对于"求总长度最大的一段的长度最小值"这个问题,我们比较容易想到二分答案然后判断是否合法,显然这个是 ...

最新文章

  1. MVC中实现订单表和订单详细表联动新增的一种方法
  2. 面向对象(上)知识点
  3. 解析XML的4种方式及优缺点比较
  4. idea设置默认maven路径(2020版idea)
  5. 性能测试工具系列(一):性能测试工具对比分析
  6. ie浏览器ip代理怎么设置
  7. 第17课 欧耶欧耶 《小学生C++趣味编程》
  8. 暑期训练日志----2018.8.11
  9. 如何对付vc6的疑难杂症
  10. 使用GridFS上传下载图片以及其他文件
  11. 访问控制:protected
  12. 电脑耗电知多少及如何节能
  13. 使用正则表达式时,容易出错的地方~
  14. 【动态规划 斐波那切数列】LeetCode 746. Min Cost Climbing Stairs
  15. 博文视点大讲堂第44期——招聘真相全揭秘 圆满结束
  16. ubuntu 安装php 扩展和查看扩展包
  17. 如何编辑已存在的.fig文件
  18. 苹果手机解压缩软件_Mac用户必备的几款压缩与解压缩软件!滴!滴!滴!
  19. sessionStorage和localStorage
  20. 怎么把ppt转化成图片

热门文章

  1. token干什么用_浅谈Token理解运用
  2. 文件行数_linux/unix下如何统计文件行数
  3. python启动jupyter,在Jupyter上启动python脚本作为后台作业
  4. 服务器运行jar包日志怎么清理,docker 启动jar包,并将日志文件进行挂载
  5. 中点和中值滤波的区别_桥式整流二极管及滤波电容如何选择
  6. 农村信用社招聘考试计算机,农村信用社招聘考试题:计算机(一)
  7. c++ 私有内部类_Java内部类新解,你没有见过的船新版本
  8. brew mysql 无法启动_MAC OSX brew 升级 mysql5.6到5.7无法启动的问题
  9. java执行python路径_java调用其它语言脚本(python、js)
  10. mac10.12 安装mysql_在mac os10.12上安装mysql5.7.18