ZOJ 2625 Rearrange Them(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1625
题目大意:将n个数重新排列,使得每个数的前一个数都不能和之前的一样,求一共有多少种排列方法
ample Input:
3
4
Sample Output:
3
11
分析:
CrazyAC's 解题报告:
本题一道DP题 仔细想想不难的
首先我们确定状态F[N]表示所产生的新排列的情况数
那么F[N]=f(F[N-1]) 怎么来确定他呢?
由于F[N-1]是排好了;所以只要把N往里插,唯一不可插的地方就是N-1后;所以共有N-1情况,
那么F[N]=(N-1)*F[N-1] (1)似乎这个式子就对了 但是自己手写几组数据是不对的 郁闷中啊~~~
但仔细想想肯定是漏情况了 在哪呢?原来是在我们已经排除的那些组合里,举个例子:N=3
是有3种排列:1 3 2;2 1 3;3 2 1
那么N=4 时,如果只考虑1 3 2;2 1 3;3 2 1这3种就少情况了,原因出在2 3 1;3 1 2这两
个排列没考虑;只要在2 3 1中的2 3之间插4,在3 1 2中的1 2之间插4即可;由此可以发现
在(1)中要加一个参数g(N-1)其表示在N-1个数的排列中,有唯一一对原顺序的排列情况
g(N)如何确定?我们只要用捆绑一对数的思想就可以;举个例子:把1 2 3 4 5 6中的2 3看
成一个数其等价与1 2 3 4 5,所以g(N)=h(F[N-1]),由于捆绑对数就是N-1,就是(1 2 ,2 3, 3 4...)
那么g(N)就确定了:g(N)=(N-1)*F[N-1];所以完成状态方程:F[N]=(N-1)*F[N-1]+(N-2)*F[N-2];
注意边界条件F[0]=0 F[1]=0 F[2]=1 F[3]=3(要用大数)
代码如下:
#include <stdio.h>
#include <string.h> int f[][]; void add(int a,int b,int c){
int i,car=,k;
for(i=;i<=;i++){
k=b*f[b][i]+c*f[c][i]+car;
f[a][i]=k%;
car=k/;
}
} void DP(){
int i;
memset(f,,sizeof(f));
f[][]=;
f[][]=;
f[][]=;
f[][]=;
for(i=;i<=;i++){
add(i,i-,i-);
}
} int main()
{
int i,j,n;
DP();
while(scanf("%d",&n)!=EOF){
if(n== || n==){
printf("0\n");
continue;
}
for(i=;i>=;i--)
if(f[n][i]) break;
for(j=i;j>=;j--)
printf("%d",f[n][j]);
printf("\n");
}
return ;
}
ZOJ 2625 Rearrange Them(DP)的更多相关文章
- ZOJ 4027 Sequence Swapping(DP)题解
题意:一串括号,每个括号代表一个值,当有相邻括号组成()时,可以交换他们两个并得到他们值的乘积,问你最大能得到多少 思路:DP题,注定想得掉头发. 显然一个左括号( 的最远交换距离由他右边的左括号的最 ...
- ZOJ 2745 01-K Code(DP)(转)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1745 题目大意:一个串由N个字符组成,每个字符是‘0’或者是‘1’, ...
- ZOJ 1013 Great Equipment(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=13 题目大意:说的是有三种不同的装备,分别是头盔,盔甲,战靴需要运输, ...
- ZOJ 3211 Dream City(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3374 题目大意:JAVAMAN 到梦幻城市旅游见到了黄金树,黄金树上 ...
- ZOJ 2702 Unrhymable Rhymes(DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1702 题目大意:给定有很多数字组成的诗,譬如 “AABB”, “AB ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- ZOJ 2477 Magic Cube(魔方)
ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds Memory Limit: 65536 KB This is a very popular gam ...
随机推荐
- Windows常用命令使用总结
Windows dos常用命令的熟练使用有助于提高工作效率. 1.windows+R:打开运行程序窗口 2.cmd:调用DOS命令窗口 3.mstsc:调用远程桌面命令窗口 4.mspaint:调用画 ...
- Win7 U盘安装Ubuntu16.04 双系统
Win7系统下安装Ubuntu系统,主要分为三步: 第1步:制作U盘启动盘 第2步:安装Ubuntu系统 第3步:创建启动系统引导 第1步:制作U盘启动盘 1.下载Ubuntu16.04安装镜像,官网 ...
- 消息队列数量统计(MSMQ,Performance Counter)
微软消息队列服务MSMQ (Microsoft Message Queue),工作在在线或者离线场景,并提供异步编程功能.互联网和企业开发很多场景应用,例如电商的订单处理流程,这是因为客户端不需要等待 ...
- SQLite使用教程6 创建表
http://www.runoob.com/sqlite/sqlite-create-table.html SQLite 创建表 SQLite 的 CREATE TABLE 语句用于在任何给定的数据库 ...
- Action开发、通配符、路径问题和struts中常量用法
1.action开发 开发的几种方式 (1).继承自ActionSupport,(如果用struts的数据效验功,能必须必须使用此功能,因为ActionSupport实现了数据效验的接口) publi ...
- nonce和timestamp在Http安全协议中的作用
前段时间给客户网站做新浪微博账号登录功能,对OAuth协议以及相关的一些安全协议做了一些研究,顺便就记录一下学习心得吧.在这里就不打算具体讲OAuth的协议流程了,而是针对OAuth请求头里的nonc ...
- [Python]linux自己定义Python脚本命令
在window下写好的程序配置到Linux上,要实现随意文件夹下的命令调用. 因为初学Linux,这里从文件传输等最主要的方法入手,记录配置的过程中遇到的各种问题. 连接远端server 这里使用pu ...
- 面试题总结之Linux/Shell
Linux Linux cshrc文件作用 Linux如何起进程/查看进程/杀进程 Linux 文件755 代表什么权限 Linux辅助线程 Linux进程间通信方法 pipeline,msgq... ...
- What is a heap?--reference
A heap is a partially sorted binary tree. Although a heap is not completely in order, it conforms to ...
- 【转】Android LruCache源码介绍
本文来源:转载自: http://blog.csdn.net/linghu_java/article/details/8574102 package android.util; import java ...