题目:https://jzoj.net/senior/#main/show/1667

只注重0、1、2的列有多少个,不注重它们的位置,就能记录了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=105,mod=9999973;
int n,m,dp[2][N][N][N],ans,jc[N],jcn[N];
int pw(int x,int k)
{int ret=1;while(k){if(k&1)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=1;}return ret;
}
void init()
{jc[0]=1;for(int i=1;i<=m;i++)jc[i]=(ll)jc[i-1]*i%mod;/////m not njcn[m]=pw(jc[m],mod-2);for(int i=m-1;i>=0;i--)jcn[i]=(ll)jcn[i+1]*(i+1)%mod;
}
int C(int n,int m)
{return (ll)jc[n]*jcn[m]%mod*jcn[n-m]%mod;
}
int main()
{scanf("%d%d",&n,&m);dp[0][m][0][0]=1;init();for(int i=1;i<=n;i++){int d=(i&1);for(int x=0;x<=m;x++)for(int y=0;y<=m;y++){int z=m-x-y;dp[d][x][y][z]=dp[!d][x][y][z];if(y)(dp[d][x][y][z]+=(ll)dp[!d][x+1][y-1][z]*(x+1)%mod)%=mod;//0->1if(z)(dp[d][x][y][z]+=(ll)dp[!d][x][y+1][z-1]*(y+1)%mod)%=mod;//1->2if(y>1)(dp[d][x][y][z]+=(ll)dp[!d][x+2][y-2][z]*C(x+2,2)%mod)%=mod;//0,0->1,1if(y&&z)(dp[d][x][y][z]+=(ll)dp[!d][x+1][y][z-1]*(x+1)%mod*y%mod)%=mod;//0,1->1,2if(z>1)(dp[d][x][y][z]+=(ll)dp[!d][x][y+2][z-2]*C(y+2,2)%mod)%=mod;//1,1->2,2
            }}int d=(n&1);for(int x=0;x<=m;x++) for(int y=0;y<=m;y++) (ans+=dp[d][x][y][m-x-y])%=mod;printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/9427241.html

JZOJ 1667【AHOI2009】中国象棋——dp相关推荐

  1. 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP

    P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...

  2. BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

    dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...

  3. BZOJ 1801 [Ahoi2009]中国象棋(线性动规)(洛谷P2051)

    题意:就是在n*m的格子中放"炮"(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状 ...

  4. AHOI2009 中国象棋

    题目链接 题目描述 在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. (在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同 ...

  5. LG_2051_[AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  6. 【洛谷 P2051】 [AHOI2009]中国象棋(DP)

    题目链接 首先想到状压dp,但是\(n,m\)高达100,怎么压? 容易发现,每行每列最多两个象棋,否则就直接gg了. 一个巧妙的设置状态的方式是,只需要记录到当前行有多少列是放了1个炮和2个炮. 然 ...

  7. 洛谷 - P2051 [AHOI2009]中国象棋(计数dp)

    题目链接:点击查看 题目大意:给出一个 n * m 的棋盘,可以在任意位置放置 "炮",问一共可以放置多少种可行的方案 题目分析:转换题意,就是问每一行.每一列至多有两个棋子的方案 ...

  8. 洛谷2051 [AHOI2009]中国象棋

    题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...

  9. [AHOI2009]中国象棋

    https://www.luogu.org/problemnew/show/P2051 C++版本一 数位DP变形 棋子的顺序是无所谓的,并不需要准确知道当前棋盘的状态 于是有了100分做法:dp[i ...

最新文章

  1. 基于视频理解TSM和数据集20bn-jester-v1的27类手势识别
  2. 转 sessionid如何产生?由谁产生?保存在哪里?
  3. 如何设计秒杀服务器的限流策略
  4. lua学习笔记之模块、包
  5. Matlab Compiler路径
  6. hugo 能做web开发吗_如何自托管Hugo Web应用
  7. python基础--列表,元组
  8. DBSCAN聚类算法C++实现
  9. 【数据结构与算法C语言版】基础代码整理 思维导图
  10. 四川自考计算机信息管理专业,计算机信息管理专业2019年10月四川自考科目及考试时间[本科]...
  11. xheditor 内容保存时 不转义html特殊字符,XHEditor使用文档(转载收藏)
  12. java马里奥_java马里奥毕业设计
  13. 128g固态加1linux分区,应该如何使用128G加1T机械硬盘?要不要分盘?
  14. 操作系统期末实验:多用户二级文件系统
  15. 04-栈和队列-循环队列的基本使用
  16. DHCP如何分配IP地址
  17. 红外避障模块c语言编写程序,红外避障模块(红外对管)51单片机驱动源程序
  18. 学习阶段C语言程序汇总
  19. Visual Studio开发STM32,VS+VisualGDB下载及配置
  20. 基于蜣螂算法改进的随机森林回归算法 - 附代码

热门文章

  1. 当把CocoaPods生成的workspace移动到上层目录时
  2. HDU 1034 - Candy Sharing Game
  3. 【云图】如何制作中国贪官落马图?
  4. 如何运行网页html,如何在网页中运行html代码
  5. CCCC-GPLT L3-015. 球队“食物链” 团体程序设计天梯赛
  6. Android Device Monitor 的 File Explorer 打开一片空白,不显示文件
  7. cin.getline()、getline()、gets()、cin.get(),getchar()的区别
  8. 停车场管理系统 java_使用java编写一个停车场管理系统
  9. 几个常用存储引擎的特点
  10. linux之删除vi残留的swp文件