题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4689

  题意:初始序列1,2...n,求所有满足与初始序列规定大小的错排数目。。

  这道题目感觉很不错~

  题目数据很容易想到用压缩DP,但这题测试数据很多,状压基本都会TLE。。

  f[i][j]表示前 i 个数还有 j 个+号没有放数字,-号全部放满。

  当 i 为+号时:1、当前这个数不放,即放在后面的位置中,f[i][j]+=f[i-1][j-1]。2、当前这个数放在前面的位置中,f[i][j]+=f[i-1][j]*j。所以f[i][j]=f[i-1][j-1]+f[i-1][j]*j。

  当 i 为-号时:1、当前这个数放在后面的位置中,由前面+号未填的数来填-号,f[i][j]+=f[i-1][j]*j。2、当前这个数放在前面的位置中,前面 j 个数放在当前的-号位,当前这个数放在前面未放的+号位,f[i][j]+=f[i-1][j+1]*j*j。

 //STATUS:C++_AC_15MS_232KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
//#include <map>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,102400000")
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
typedef __int64 LL;
typedef unsigned __int64 ULL;
//const
const int N=;
const int INF=0x3f3f3f3f;
const int MOD=,STA=;
const LL LNF=1LL<<;
const double EPS=1e-;
const double OO=1e15;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End LL f[N][N];
char s[N]; int main(){
// freopen("in.txt","r",stdin);
int i,j,len;
while(~scanf("%s",s))
{
mem(f,);
f[][]=;
len=strlen(s);
for(i=;i<=len;i++){
if(s[i-]=='+'){
for(j=;j<=len;j++)
f[i][j]=f[i-][j-]+f[i-][j]*j;
}
else {
for(j=;j<=len;j++){
f[i][j-]+=f[i-][j]*j*j;
f[i][j]+=f[i-][j]*j;
}
}
} printf("%I64d\n",f[len][]);
}
return ;
}

HDU-4689 Derangement DP的更多相关文章

  1. HDOJ 4689 Derangement DP

    DP具体解释见: http://blog.csdn.net/liguan1/article/details/10468139 Derangement Time Limit: 7000/7000 MS ...

  2. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  3. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  4. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

  5. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  8. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  9. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  10. HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)

    HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包) 题意分析 与普通的完全背包大同小异,区别就在于多了一个个数限制,那么在普通的完全背包的基础上,增加一维,表示个数.同时for循环 ...

随机推荐

  1. N-Queens leetcode java

    题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...

  2. POJ3687——Labeling Balls(反向建图+拓扑排序)

    Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...

  3. Vim插件列表

    01.helm(Vim-Swoop) 02.ap/vim-buftabline 03.wesleyche/SrcExpl 04.vim proc 05.vim shell 06.dhruvasagar ...

  4. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  5. C#和.net之间的关系

    What is the difference between C# and .NET? In addition to what Andrew said, it is worth noting that ...

  6. Shell中判断字符串是否为数字的6种方法分享

    #!/bin/bash ## 方法1 a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] &&a ...

  7. Gentoo安装

    Gentoo Linux安装详解--根据官方WiKi整理 时间:2014-06-26 06:37:54      阅读:549      评论:0      收藏:0      [点我收藏+] 标签: ...

  8. Shell Script Tutorials (0 ~ 62)

    Tutorial-1: Introduction Tutorial-2: Shell, Kernel, Terminal & More Tutorial-3: View System Date ...

  9. Ehcache和MemCached比较分析

    项目 Memcache Ehcache 分布式 不完全,集群默认不实现 支持 集群 可通过客户端实现 支持(默认是异步同步) 持久化 可通过第三方应用实现,如sina研发的memcachedb,将ca ...

  10. (4)java方法区

    java方法区[名词解析]        --->和java堆一样,方法区是一块所有线程共享的内存区域.        --->保存系统的类信息,比如,类的字段,方法,常量池等.      ...