九度 1552 座位问题(递推DP)
例如当n为4时,共有
女女女女, 女女女男, 男女女女, 女女男男, 男女女男, 男男女女, 男男男男
7种。
思路
1. 读完题, 感觉这是道 DP 题
2. 前几天做了一道统计括号数的题目, 和此题比较类似
3. dp[i][j] 表示前 i 个人中有 j 个女生的方案数, 那么状态转移方程就能写为
dp[i][j] = dp[i-1][j] (最后一位放男生) + dp[i-2][j-2] (最后一位放女生, 那么倒数第二位必须是女生)
4. 初始化 dp[i][0] = 1, dp[i][1] = 0. 但要考虑例外, dp[4][3] = dp[3][3] + dp[2][1], 这种情况下 dp[2][1] 应该取 1
5. 从 1 写到 5, 这个思路都 work, 不过仍是 WA 到死
update 2014年3月10日12:42:13
上面的状态转移方程是错误的.
在 (4) 中, 谈到了例外, 然而这个例外并不是唯一的. 当 n = 6 时, 求解 dp[6][5] = dp[5][5] + dp[4][3]
其中 dp[5][5] = 1, 而 dp[4][3] 是 2, 分别为 FFFM, MFFF.
但是, 少算了一个, FFMF, 因为已经确定了最后两位是 FF
dp[i][j] 表示在第 i 个位置放置男生(j = 0) 或女生(i = 0) 的方案数
那么 dp[i][0] = dp[i-1][0] + dp[i-1][1]
难点是求解 dp[i][1], dp[i][1] = dp[k][0] k = [0, i-2] 意思是第 i 个位置放女士, 那么第 i-1 个位置上也肯定是女生, 那么我们就枚举最后一个男生出现的位置
dp[k][0] 表示第 k 个位置上是男生的方案数, 同时也表示第 k 个位置上是男生且 k+1 -> i 位置上都是女生的方案数
可以用单调队列记录前 i-2 个位置上放男生的方案数, 这样, 时间复杂度下降到了 o(n)
代码
#include <iostream>
#include <memory.h>
#include <stdio.h>
using namespace std; const int NO_DEFINE = 0x80808080;
int solution[][]; int n; void init() {
memset(solution, 0x80, sizeof(solution));
solution[][] = ;
solution[][] = ;
solution[][] = ;
solution[][] = ;
solution[][] = ;
solution[][] = ;
} int getSolution(int a, int b) {
if(solution[a][b] != NO_DEFINE)
return solution[a][b]; if(b == )
return (solution[a][b] = (getSolution(a-, )+ getSolution(a-, ))% );
else if(b == ) {
return (solution[a][b] = getSolution(a-, ))% ;
}
else {
return (solution[a][b] = (getSolution(a-, b)+getSolution(a-, ))% );
} }
int main() {
init();
while(scanf("%d", &n) != EOF) {
int res = ;
for(int i = ; i <= ; i ++) {
res = res + getSolution(n, i);
res = (res >= ) ? res % :res;
}
printf("%d\n", res);
}
return ;
}
九度 1552 座位问题(递推DP)的更多相关文章
- 九度 1547 出入栈(递推DP)
题目描述: 给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈.要求在操作序列的执行过程中不会出现非法的操作,即不会在空栈时执行出栈操作,同时保证当操作序列完成后,栈恰好为一 ...
- 九度OJ 1081:递推数列 (递归,二分法)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6194 解决:864 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第 ...
- Code Force 429B Working out【递推dp】
Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...
- 递推DP URAL 1167 Bicolored Horses
题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...
- 递推DP URAL 1017 Staircases
题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...
- 递推DP URAL 1260 Nudnik Photographer
题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...
- 递推DP URAL 1353 Milliard Vasya's Function
题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...
- 递推DP URAL 1119 Metro
题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...
- 递推DP 赛码 1005 Game
题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...
随机推荐
- sql 表连接基本的语法
SQL连接能够分为内连接.外连接.交叉连接. 1.内连接:内连接查询操作列出与连接条件匹配的数据行,它使用比較运算符比較被连接列的列值. 1.1 select * from Table1 as a, ...
- Redis有序集合
Redis有序集合类似Redis集合存储在设定值唯一性.不同的是,一个有序集合的每个成员带有分数,用于以便采取有序set命令,从最小的到最大的分数有关. Redis 有序set添加,删除和测试中的O( ...
- jQuery(四):HTML代码操作
html()可以对HTML代码进行操作,类似于元素JavaScript中的innerHTML. 例如: 示例: <!DOCTYPE html> <html lang="en ...
- mysql导入sql脚本
例如:我的用户名是root 密码是123 sql脚本存在C盘 名字为test.sql 数据库为test 有两种方法可以执行脚本 1:打开CMD输入以下命令(不需要转换目录)>mysql -u r ...
- poj 1723 中位数
最近在看一些中位数的东西,然后顺便也看了些题目.poj 1723不仅要求到水平位置的最短距离和,还要求水平都相邻的排成一排的最短距离和,即士兵都站成一列. 到y轴的距离好办,按y轴坐标排序,求中位数, ...
- 初试PyOpenGL一 (Python+OpenGL)
很早就一直想学Python,看到一些书都有介绍,不管是做为游戏的脚本语言,还是做为开发项目的主要语言都有提及(最主要的CUDA都开始支持Python,CUDA后面一定要学),做为先熟悉一下Python ...
- (笔记)电路设计(十一)之DC/DC电源转换方案设计应用
十大 法则之一:搞懂什么是DC/DC电源以及DC/DC转换电路分类 DC/DC电源电路又称为DC/DC转换电路,其主要功能就是进行输入输出电压转换.一般我们把输入电源电压在72V以内的电压变换过程称为 ...
- JsonCpp 判断 value 中是否有某个KEY
JsonCpp如何判断是否有某个KEY,使用json[“key”]和isXXX的函数即可. 如果json中没有key键,则会创建一个空成员或者返回一个空成员. bool isNull() const; ...
- MySql 存储过程总结
MySql 存储过程 -- ---------------------------- -- Procedure structure for `proc_adder` -- -------------- ...
- Win10尝鲜体验——初识传说中不一样的Windows 分类: 资源分享 2015-07-24 18:27 13人阅读 评论(0) 收藏
这几天,网上传来一个消息,虽然不知是好是坏,Win10可以下载安装了! 出于好奇,下载尝鲜,几个截图,留作纪念~ 中文,还是要好好支持的,毕竟中国有如此多的用户 可选的安装版本 许可条款也刚刚出炉,估 ...