tyvj 4541 四维动态规划
来源:互联网 发布:linux mint 18.2 编辑:程序博客网 时间:2024/06/09 18:49
描述
在一个N×M的棋盘上,要求放置K个车,使得不存在一个车同时能被两个车攻击。问方案数。
输入格式
一行三个整数,N,M,K。
输出格式
一行一个整数,代表答案对1000001取模之后的值。
备注
【样例输入1】
4 5 2
【样例输出1】
190
【样例输入2】
2 3 3
【样例输出2】
6
【样例输入3】
6 7 20
【样例输出3】
0
【样例输入4】
23 37 39
【样例输出4】
288688
【样例解释】
【数据规模与约定】
对于100%的数据,1≤N,M≤50,1≤K≤100。
分析:说实话第一次看题就觉得是状态压缩+搜索,因为之前做过的n皇后……然而这数据范围搜索肯定会炸。
所以我们考虑dp
一开始的想法就是f[i,j,k,l]表示前i行有j列放了一个车,有k列放了两个车,总共放了l个车的方案数。那么就是说如果第i行只放一个车的话我就可以有两种选择:一种是放在一个空列中(数量为m-j-k),一种是放在一个只放了一个车的列。但考虑第二种选择,如果该列上的车所在的行还有另一个车,那么其实这一列是不能再放一个车的。那么我们就把状态改一下:
f[i,j,k,l]表示前i行,有j列是只放了一个车且还可以再放一个车,有k列是不能再放的(包括放了两个车的列和放了一个车但不能再放的列),l表示已经放了多少个车。
f[i-1,j,k,l]表示第i行不放车
f[i-1,j-1,k,l-1]*(m-j-k+1)表示第i行放一个车且把车放到一个原本没有车的列上
f[i-1,j+1,k-1,l-1]*(j-1)表示第i行放一个车且把车放到一个原本有一个车的列上
f[i-1,j,k-2,l-2]*(m-j-k+2)*(m-j-k+1)/2表示第i行放两个车
f[i][j][k][l]=f[i-1][j][k][l]+f[i-1][j-1][k][l-1]*(m-j-k+1)+f[i-1][j+1][k-1][l-1]*(j+1)+f[i-1][j][k-2][l-2]*(m-j-k+2)*(m-j-k+1)/2
可以用滚动数组优化空间
代码:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define MOD 1000001using namespace std;int f[2][60][60][110],n,m,tot;int main(){scanf("%d%d%d",&n,&m,&tot);int now=0;f[now][0][0][0]=1;for (int i=1;i<=n;i++){now=1-now;memset(f[now],0,sizeof(f[now]));for (int j=0;j<=m;j++)for (int k=0;k<=m-j;k++)for (int l=j+k;l<=min(j+k*2,tot);l++){//f[now][j][k][l]=(f[1-now][j][k][l]+f[1-now][j-1][k][l-1]*(m-j-k+1)+f[1-now][j+1][k-1][l-1]*(j+1)+f[1-now][j][k-2][l-2]*(m-j-k+2)*(m-j-k+1)/2)%MOD;f[now][j][k][l]=f[1-now][j][k][l];if (j&&l) f[now][j][k][l]+=f[1-now][j-1][k][l-1]*(m-j-k+1);if (k&&l) f[now][j][k][l]+=f[1-now][j+1][k-1][l-1]*(j+1);if (k>1&&l>1) f[now][j][k][l]+=f[1-now][j][k-2][l-2]*(m-j-k+2)*(m-j-k+1)/2;f[now][j][k][l]%=MOD;}}int ans=0;for (int i=0;i<=m;i++)for (int j=0;j<=m-i;j++)ans=(ans+f[now][i][j][tot])%MOD;printf("%d",ans);return 0;}
- tyvj 4541 四维动态规划
- 【动态规划】【tyvj】乘法游戏
- |Tyvj|动态规划|P2865 打包
- |Tyvj|动态规划|P1004 滑雪
- |Tyvj|动态规划|P1071 LCIS
- tyvj P1014 惩罚游戏 区间动态规划
- |Tyvj|动态规划|P1044 数字三角形
- |Tyvj|NOIP2004|动态规划|P1067 合唱队形
- |Tyvj|动态规划|P1203 机器分配
- |Tyvj|动态规划|P1016 装箱问题
- |Tyvj|NOIP2005|动态规划|P1005 采药
- |Tyvj|动态规划|P1015 公路乘车
- |Tyvj|动态规划|P1516 科技庄园
- |Tyvj|NOI1995|动态规划|P1055 沙子合并
- |Tyvj|NOIP2000|动态规划|P1047 乘积最大
- |Tyvj|动态规划|P1102 单词的划分
- |Tyvj|NOIP2008|动态规划|P1011 传纸条
- |Tyvj|动态规划|1023 奶牛的锻炼
- 数据库范式(1NF 2NF 3NF BCNF)
- 哈佛大学校长演讲——生活的意义
- RecyclerView嵌套ListView解决点击事件问题
- 神泣7.0与9.0的 服务端 !!
- QueryRunner的使用 DBUtils框架简介、DbUtils类、QueryRunner类 、ResultSetHandler接口
- tyvj 4541 四维动态规划
- NameSpace命名空间的学习
- 语法分析
- JDK安装及Java环境变量配置
- SQL Join的一些总结
- iOS基础2
- josn 404 405 415
- 专业测评:iphone7致命缺陷曝光
- hdoj3664【DP】