题意:构造一个串,满足以下条件(1)串中只有0和1两个字符、(2)0最多连续m个,1最多连续n个、(3)该串的长度为k,求满足以上条件的串最多有几种
链接:http://acm.timus.ru/problem.aspx?space=1&num=2018
思路:dp问题,设计状态,dp[i][j][k],表示第i个字符为j时有连续k个字符的可能性。
注意点:内存限制不能开dp[50000][2][300],用2*2*300的滚动数组即可
以下为AC代码:
ID | Date | Author | Problem | Language | Judgement result | Test # | Execution time | Memory used |
---|---|---|---|---|---|---|---|---|
6252790 |
07:01:55
18 May 2015 | luminous11 | 2018. The Debut Album | G++ 4.9 C++11 | Accepted | 0.25 | 386 KB |
/*
***********************************************
*# @Author : Luminous11 (573728051@qq.com)
*# @Date : 2015-05-17 23:12:59
*# @Link : http://blog.csdn.net/luminous11
***********************************************
*/
#include <bits/stdc++.h>
#define clr(a, v) memset( a , v , sizeof(a) )
using namespace std;
const int mod = 1e9 + 7;
const double eps = 1e-10;
const double pi = acos(-1.0);
int dp[2][2][305];
int main()
{
// ios::sync_with_stdio ( false );
int n, m, k;
while ( scanf ( "%d%d%d", &k, &m, &n ) !=EOF ){
memset ( dp, 0, sizeof ( dp ) );
dp[0][0][1] = 1;
dp[0][1][1] = 1;
int p = 0;
for ( int i = 1; i < k; i ++ ){
p ^= 1;
memset ( dp[p], 0, sizeof ( dp[p] ) );
for ( int l = 1; l <= m; l ++ ){
dp[p][0][l] += dp[p^1][0][l-1];
dp[p][0][l] %= mod;
dp[p][1][1] += dp[p^1][0][l];
dp[p][1][1] %= mod;
}
for ( int l = 1; l <= n; l ++ ){
dp[p][1][l] += dp[p^1][1][l-1];
dp[p][1][l] %= mod;
dp[p][0][1] += dp[p^1][1][l];
dp[p][0][1] %= mod;
}
}
int ans = 0;
for ( int j = 1; j <= m; j ++ ){
ans += dp[p][0][j];
ans %= mod;
}
for ( int j = 1; j <= n; j ++ ){
ans += dp[p][1][j];
ans %= mod;
}
printf ( "%d\n", ans );
}
return 0;
}