Codeforces Round #273 (Div. 2)(D)dp,滚动数组
来源:互联网 发布:德旭交规软件 编辑:程序博客网 时间:2024/05/17 04:11
题意:给你n个红块,m个绿块,要搭出一个塔,第K层有K个,且每一层颜色必须全部相同,问在塔搭出最高的情形下有多少种搭的方法。
题解:首先确定最大高度H,那么(H+1)*H/2<=m+n,由不等式求出最值H,这里DP[]I[J]表示在塔的第i层的时候,剩下J个红块的可能数,如果绿块也大于i,那么就将当前更新,这里需要使用滚动数组,如果直接开二维数组需要1e8的空间,使用2个变量next和now交替使用,使用异或运算实现滚动。在每次在使用前应该初始化一遍下一状态的数组。
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<set>#include<queue>#include<string>#include<bitset>#include<utility>#include<functional>#include<iomanip>#include<sstream>#include<ctime>#include<cassert>using namespace std;#define N int(4e5+10)#define inf int(0x3f3f3f3f)#define mod int(1e9+7)typedef long long LL;#if ( ( _WIN32 || __WIN32__ ) && __cplusplus < 201103L)#define lld "%I64d"#else#define lld "%lld"#endif#ifdef CDZSC#define debug(...) fprintf(stderr, __VA_ARGS__)#else#define debug(...) #endifint dp[2][N];int main(){#ifdef CDZSCfreopen("i.txt", "r", stdin);//freopen("o.txt","w",stdout);int _time_jc = clock();#endifint n, m;while (~scanf("%d%d", &n, &m)){int h = sqrt((m + n) << 1);while (h*(h + 1) / 2 > m + n)h--;int now = 0, next = 1, sum = 0;memset(dp, 0, sizeof(dp));dp[0][n] = 1;for (int i = 1; i <= h; i++){memset(dp[next], 0, sizeof(dp[next]));for (int red = 0; red <= n; red++){int green = n + m - red - sum;if (red >= i)dp[next][red - i] = (dp[next][red - i] + dp[now][red]) % mod;if (green >= i)dp[next][red] = (dp[next][red] + dp[now][red]) % mod;}sum += i;next ^= 1;now ^= 1;}int ans = 0;for (int i = 0; i <= n; i++)ans =(ans+ dp[now][i])%mod;printf("%d\n", ans);}#ifdef CDZSCdebug("time: %d\n", int(clock() - _time_jc));#endifreturn 0;}
0 0
- Codeforces Round #273 (Div. 2)(D)dp,滚动数组
- Codeforces Round #273 (Div. 2)D dp
- Codeforces Round #358 (Div. 2) D dp
- Codeforces Round #263 (Div. 2)D(树形DP)
- Codeforces Round #264 (Div. 2)D(图论+dp)
- Codeforces Round #266 (Div. 2)D(DP)
- Codeforces Round #244 (Div. 2)D(字符串DP)
- Codeforces Round #301 (Div. 2)D (概率dp)
- Codeforces Round #301 (Div. 2) D(概率dp)
- Codeforces Round #266 (Div. 2)D(DP)
- Codeforces Round #336 (Div. 2) D. Zuma(区间dp)
- Codeforces Round #362 (Div. 2) D Puzzles (DP)
- Codeforces Round #271 (Div. 2) D. Flowers(DP)
- Codeforces Round #424 (Div. 2) D. Office Keys(dp)
- Codeforces Round #336 (Div. 2)-D Zuma(区间DP)
- Codeforces 837D Round Subset【思维+Dp+滚动数组】
- Codeforces Round #360 (Div. 2) E. The Values You Can Make dp ,滚动数组
- 【Codeforces Round 273 (Div 2)D】【DP 滚动数组】 Red-Green Towers 两种颜色积木拼搭最高锯齿楼每层颜色相同的总方案数
- Oracle DB查看预警日志
- tableView自定义背景图结合masonry毛玻璃特效
- Android如何连接和操作SQLite数据库
- Spark SQL的使用
- SQL查询--连接查询
- Codeforces Round #273 (Div. 2)(D)dp,滚动数组
- 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易。
- Android Support Library 23.2的初体验
- C语言学习笔记_4流程控制
- Spring注入的反射解释
- 浏览器缓存--协商缓存
- Java中获取键盘输入值的三种方法
- 基于XMPP协议的Android IM研究
- 遇见过的PHP面试题