博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】BZOJ P1801 dp
阅读量:4502 次
发布时间:2019-06-08

本文共 2176 字,大约阅读时间需要 7 分钟。

一个需要考虑比较多状态的dp


 

通过象棋规则可知,一列最多有两个炮

因为如果有三个炮他们就可以互相伤害了

 

设f[i][j][k]为前i行,有j列有一个棋子,有k列有两个棋子

容斥一下可得没有棋子的列数为m-j-k

我们枚举方棋子的状态

<1>只放一个棋子

(1) 把这个棋子放在一列没有棋子的列上

 当这个棋子放好之后,有一个棋子的列会+1,没有棋子的列会-1

  f[i][j][k]=f[i][j][k]+f[i-1][j-1][k]*(m-j-k+1)

(2)把这个棋子放在一列有一个棋子的列上

 当这个棋子放好之后,有一个棋子的列会-1,有两个棋子的列会+1

  f[i][j][k]=f[i][j][k]+f[i-1][j+1][k-1]*(j+1)

<2>放两个棋子

(1) 一个放在没棋子的列上,一个放在有一个棋子的列上

 当这两个棋子放好之后,有一个棋子的列会+1,有两个棋子的列会+1,没有棋子的列会-1

   f[i][j][k]=f[i][j][k]+f[i-1][j][k-1]*j*(m-j-k+1)

(2) 两个都放在有一个棋子的列上

 当这个棋子放好之后,有一个棋子的列会-2,有两个棋子的列会+2

  f[i][j][k]=f[i][j][k]+f[i-1][j+2][k-2]*(j+2)*(j+1)/2

(3) 两个都放在没有棋子的列上

 当这个棋子放好之后,有一个棋子的列会+2,没有棋子的列会-2

  f[i][j][k]=f[i][j][k]+f[i-1][j-2][k]*(m-j-k+2)*(m-j-k+1)/2


code

////  main.cpp//  bzoj////  Created by gengyf on 2019/7/18.//  Copyright © 2019 yifan Geng. All rights reserved.//#include 
using namespace std;namespace gengyf{ inline int read(){ int f=1,x=0;char c=getchar(); while(c<'0'||c>'9'){
if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return f*x; }#define mod 9999973 int n,m,ans; int f[105][105][105]; inline int C(int x){ return x*(x-1)/2%mod; } int main(){ n=read();m=read(); f[0][0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=m-j;k++){ f[i][j][k]=f[i-1][j][k]; if(k>=1)f[i][j][k]+=f[i-1][j+1][k-1]*(j+1);//放有一个 if(j>=1)f[i][j][k]+=f[i-1][j-1][k]*(m-j-k+1);//放没棋子 if(k>=1)f[i][j][k]+=f[i-1][j][k-1]*j*(m-j-k+1); //放两个,一个在没棋子的,一个在有一个棋子的 if(k>=2)f[i][j][k]+=f[i-1][j+2][k-2]*C(j+2); //放两个,都放在有一个棋子的 if(j>=2)(f[i][j][k]+=f[i-1][j-2][k]*C(m-j-k+2)); //放两个,都放在没棋子的 f[i][j][k]%=mod; } for(int i=0;i<=m;i++) for(int j=0;j<=m;j++){ ans+=f[n][i][j]; ans%=mod; } printf("%d",(ans+mod)%mod); return 0; }}int main() { gengyf::main(); return 0;}

 

转载于:https://www.cnblogs.com/gengyf/p/11210762.html

你可能感兴趣的文章
Spiral Matrix II
查看>>
2015-9-13 NOIP模拟赛 by hzwer
查看>>
mysql idb文件过大
查看>>
c#FileStream
查看>>
拍摄好的图片,如何抠图去背景纯白..
查看>>
MySQL性能优化的21个最佳实践
查看>>
scrum 11.13
查看>>
[NOI2005]聪聪与可可
查看>>
CF17E Palisection(相交回文子串)(暑假 D6)
查看>>
菜鸟版JAVA设计模式—外观模式
查看>>
phpredis基本操作
查看>>
一个小型的表单处理框架分享
查看>>
bit,Byte,B,KB,MB,GB
查看>>
C++ 中string 的find与find_first_of 的区别?
查看>>
mysql 设置账户权限
查看>>
scons相关
查看>>
PE知识复习之PE扩大节
查看>>
工具篇-编辑器(Atom & Sublime Text3)初体验 & SFTP连接错误实例
查看>>
Xamarin中打开别人项目找不到android.jar文件
查看>>
文件还原工具Foremost
查看>>