URAL2018——The Debut Album(DP)
来源:互联网 发布:开通淘宝网店多少费用 编辑:程序博客网 时间:2024/05/28 20:19
G - The Debut Album
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 n remixes. On second thoughts the musicians decided that the album will be of interest only if there are no more than a remixes on “My love” in a row and no more than b 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 n 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 i in one variant at i-th place stands one and in another variant at the same place stands two.
The only line contains integers n, a, b (1 ≤ a, b ≤ 300; max( a, b) + 1 ≤ n ≤ 50 000).
Output the number of different record variants modulo 10 9+7.
3 2 1
4
Notes
In the example there are the following record variants: 112, 121, 211, 212.
给你一个串的长度n,串由1,2组成,1连续不超过a个,2连续不超过b个,问有多少种这样的串,对1e9+7取模。
一看题就觉得记忆化可搞,几分钟就写出来了,奈何没考虑空间复杂度,ME。。
换了个思路,干脆两个DP,dp1[i]表示第i个为1的串的方案数,dp2[j]表示第j个为2的串的方案数。
状态转移方程dp1[i]+=dp2[i-j] dp2[i]+=dp1[i-j] 最后答案dp1[n]+dp2[n]
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <stack>
using namespace std;
typedef long long ll;
#define PI 3.1415926535897932
#define E 2.718281828459045
#define INF 0xffffffff//0x3f3f3f3f
#define mod 1000000007
const int MOD=1e9+7;
const int M=1005;
int n,m;
int a,b;
int dp1[50001],dp2[50001];
int main()
{
int i,j,k,t;
int cas=0;
int ans=0;
//scanf("%d",&t);
while(~scanf("%d%d%d",&n,&a,&b))
{
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
dp1[0]=dp2[0]=1;
for(i=1; i<=n; i++)
{
for(j=1; j<=a&&j<=i; j++)
dp1[i]=(dp1[i]+dp2[i-j])%MOD;
for(j=1; j<=b&&j<=i; j++)
dp2[i]=(dp2[i]+dp1[i-j])%MOD;
}
printf("%d\n",(dp1[n]+dp2[n])%MOD);
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <stack>
using namespace std;
typedef long long ll;
#define PI 3.1415926535897932
#define E 2.718281828459045
#define INF 0xffffffff//0x3f3f3f3f
#define mod 1000000007
const int MOD=1e9+7;
const int M=1005;
int n,m;
int a,b;
int dp1[50001],dp2[50001];
int main()
{
int i,j,k,t;
int cas=0;
int ans=0;
//scanf("%d",&t);
while(~scanf("%d%d%d",&n,&a,&b))
{
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
dp1[0]=dp2[0]=1;
for(i=1; i<=n; i++)
{
for(j=1; j<=a&&j<=i; j++)
dp1[i]=(dp1[i]+dp2[i-j])%MOD;
for(j=1; j<=b&&j<=i; j++)
dp2[i]=(dp2[i]+dp1[i-j])%MOD;
}
printf("%d\n",(dp1[n]+dp2[n])%MOD);
}
return 0;
}
1 0
- URAL2018——The Debut Album(DP)
- Ural 2018The Debut Album(DP)
- URAL 2018 The Debut Album(dp)
- URAL 2018. The Debut Album (dp)
- The Debut Album (dp + 滚动数组)
- URAL 2018 The Debut Album(DP)
- 【DP】URAL 2018 The Debut Album
- ural 2018. The Debut Album 滚动数组dp
- codeforces (G) The Debut Album dp+滚动数组
- URAL 2018 The Debut Album DP中滚动数组用法
- URAL - 2018 The Debut Album
- Ural 2018 The Debut Album
- Ural 2018. The Debut Album
- Ural 2018 The Debut Album
- URAL_2018_The Debut Album(滚动数组DP)
- Gym 100507G The Debut Album
- Gym - 100507G G. The Debut Album 数位dp+内存优化
- ☆URAL 2018 The Debut Album (dp 两种写法)
- 改变世界的20个科技拐点
- JAVA设计模式之工厂模式之工厂方法模式
- C# Windows Forms编程 实用关闭窗口方式
- bzoj1449: [JSOI2009]球队收益
- poj----Anagram Groups
- URAL2018——The Debut Album(DP)
- 大型分布式网站的架构提供的各个服务
- 提高pip下载速度
- phpstudy搭建DVWA
- URAL 2015. Zhenya moves from the dormitory
- 【C#基础】——面向对象
- VPN说明书
- 15 个 Android 通用流行框架大全
- Arduino Uno + RFID 读取 把你的门禁卡读取看看有什么秘密