博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 4321: queue2
阅读量:4910 次
发布时间:2019-06-11

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

4321: queue2

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 475  Solved: 287
[][][]

Description

n 个沙茶,被编号 1~n。排完队之后,每个沙茶希望,自己的相邻的两
人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行; 
现在想知道,存在多少方案满足沙茶们如此不苛刻的条件。 
 

 

Input

只有一行且为用空格隔开的一个正整数 N,其中 100%的数据满足 1≤N ≤ 1000; 
 
 

 

Output

一个非负整数,表示方案数对 7777777 取模。   
 

 

Sample Input

4

Sample Output

2
样例解释:有两种方案 2 4 1 3 和 3 1 4 2
 
 
设f[i][j][k]为排完1-i之后,有j对相邻位置差一,并且i是否和i-1相邻的方案数。
然后随便推一推转移就好了,这里稍微提一下怎么推转移,至于最后的式子看代码就好了。
首先,我们看一下f[i][j][0]可以转移到哪些状态:
1.我们在i的两边放i+1,都会让差一的相邻位置+1。
所以f[i+1][j+1][1]+=2*f[i][j][0]。
2.我们在j对差一的相邻位置中间放i+1,都会让差一的相邻位置-1。
并且因为i于i-1不相邻,所以j对里不用减去,并且放完之后i+1和i不相邻,所以就是:
f[i+1][j-1][0]+=j*f[i][j][0]。
3.在剩下的i-j-1个空挡里放,不仅i和i+1不相邻,并且相邻差一的不会增多,
所以f[i+1][j][0]+=(i-j-1)*f[i][j][0]。
 
f[i][j][1]的情况类似,推一下就好了。
 
/**************************************************************	Problem: 4321	User: JYYHH	Language: C++	Result: Accepted	Time:484 ms	Memory:9180 kb****************************************************************/#include
#define ll long long#define maxn 1005using namespace std;const int ha=7777777;int f[maxn][maxn][2];int n;inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}inline void dp(){ f[1][0][0]=1; for(int i=1;i
>n; dp(); cout<
<

  

转载于:https://www.cnblogs.com/JYYHH/p/8504715.html

你可能感兴趣的文章
github下载下来的C#控制台小游戏[含源码]
查看>>
CMD复制文件夹
查看>>
尽力而为
查看>>
Java技术预备作业
查看>>
阿虎烧烤的新感悟-O2O你真的会玩吗?
查看>>
CrystalReportViewer的事件
查看>>
Oracle10g闪回恢复区详细解析(转载)
查看>>
手把手教你从零认识webpack4.0
查看>>
(译)加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分
查看>>
[小米OJ] 3. 大数相减
查看>>
课后作业2:编写一个文件加解密程序,通过命令行完成加解密工作
查看>>
js 值类型和引用类型
查看>>
java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果
查看>>
java相关。关于jsp中使用el表达式的格式,谢谢!
查看>>
GetDlgItem的用法小结
查看>>
java带包编译
查看>>
树状数组详解(重拾笔记)
查看>>
javascript深入理解js闭包
查看>>
PLSQL
查看>>
ASP.NET Core 应用程序Startup类介绍
查看>>