火题大战Vol.0 B 计数DP
火题大战Vol.0 B
题目描述
\(n\) 个沙茶,被编号 \(1\)~$ n$。排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1\))就行;
现在想知道,存在多少方案满足沙茶们如此不苛刻的条件。
输入格式
只有一行且为用空格隔开的一个正整数 \(N\)。
输出格式
一个非负整数,表示方案数对 \(7777777\) 取模。
样例
样例输入
4
样例输出
2
样例解释
有两种方案 \(2\ 4\ 1\ 3\) 和 \(3\ 1\ 4\ 2\)
数据范围与提示
对于\(30\%\)的数据满足\(N \leq 20\)
对于\(100\%\)的数据满足\(1 \leq N \leq 1000\) ;
分析
我们设 \(f[i][j][0]\) 为填了 \(1\)到\(i\),当前有 \(j\) 对两两之间相差一的人,并且\(i\)和\(i-1\)不相邻的方案数
设 \(f[i][j][1]\) 为填了 \(1\)到\(i\),当前有 \(j\) 对两两之间相差一的人,并且\(i\)和\(i-1\)相邻的方案数
对于\(f[i][j][0]\),如果我们在这\(j\)对人的中间插入一个数,那么两两之间相差一的人会少一对,因为此时\(i\)和\(i-1\)不相邻
转移方程 \(f[i+1][j-1][0]+=j \times f[i][j][0]\)
如果我们在\(i\)的旁边插入\(i+1\),那么两两之间相差一的人会多一对,并且\(i\)和\(i+1\)相邻,因此会转移至 \(f[i+1][j+1][1]\)
转移方程 \(f[i+1][j+1][1]+=2 \times f[i][j][0]\)
此时,我们在剩下的位置插入不会对对数产生影响,即
\(f[i+1][j][0]+=(i-1-j) \times f[i][j][0]\)
对于\(f[i][j][1]\) 如果我们在\(i\)和\(i-1\)的中间插入\(i+1\),则有
\(f[i+1][j][1]+=f[i][j][1]\)
如果我们在\(i\)的另一边插入\(i+1\),则有
\(f[i+1][j+1][1]+=f[i][j][1];\)
如果我们在其它的 \(j-1\) 个空位中插入,则有
\(f[i+1][j-1][0]+=f[i][j][1]*(j-1)\)
如果我们在其它的空位中插入,则有
\(f[i+1][j][0]+=f[i][j][1]*(i-j)\)
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
#define int long long
int f[maxn][maxn][3];
const int mod=7777777;
signed main(){
int n;
scanf("%lld",&n);
f[2][1][1]=2;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
f[i+1][j-1][0]+=j*f[i][j][0];
f[i+1][j-1][0]%=mod;
f[i+1][j+1][1]+=2*f[i][j][0];
f[i+1][j+1][1]%=mod;
if(i-j-1>0){
f[i+1][j][0]+=(i-1-j)*f[i][j][0];
f[i+1][j][0]%=mod;
}
if(j-1>0) {
f[i+1][j-1][0]+=f[i][j][1]*(j-1);
f[i+1][j-1][0]%=mod;
}
f[i+1][j][1]+=f[i][j][1];
f[i+1][j][1]%=mod;
f[i+1][j+1][1]+=f[i][j][1];
f[i+1][j+1][1]%=mod;
f[i+1][j][0]+=f[i][j][1]*(i-j);
f[i+1][j][0]%=mod;
}
}
printf("%lld\n",f[n][0][0]);
return 0;
}
最新文章
- 关于java中多态的理解
- T-SQL编程 —— 用户自定义函数(内嵌表值函数)
- 按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”
- NYOJ题目611练练
- app 后端技术
- CSS实现图片变灰色及透明度
- Altium Designer 多通道设计
- Ruby On Rails 4 hello world,Ruby On Rails上手
- Android-3 Activity启动模式
- 关于sql中去换行符的问题
- 由String的构造方法引申出来的java字符编码
- Apache-Flink深度解析-State
- Python全栈习题一
- Java语法基础学习DayFifteen(IO续)
- 操作系统概述(os 笔记一)
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-5 底层驱动之SDRAM读写(下)
- golang并发ping主机
- Hasura GraphQL schema 生成是如何工作的
- 动态添加布局、动态添加View、LinearLayout动态添加View;
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系