NKU 1134 Relation Ordering 【dp】

来源:互联网 发布:已备案域名更换服务器 编辑:程序博客网 时间:2024/05/30 23:52

NKU 1134 Relation Ordering

Relation Ordering 序关系计数问题 

一道很经典的dp题目。

Dp题目,首先是尝试找合适的最优子结构,或者有公共子问题。

然后自己设计出合适的利于转移的状态。可以适当增加维数。

另外本题解的范围会超过long long。。所有需要高精度。

因此用java来水。嘿嘿。

(ps:以前觉得这种方法甚是ws,后来觉得用C++的高精度模板,没什么区别,也是ws);

两种经典解法。

①dp[i]  表示: i个数能得到的不同的序关系的个数

  dp[i]=sum { Cik * dp[i-k] }   k∈[1,i];

  分析:显然,对于任意i个数的序列。

  总能有这样的k  a1=a2=a3=..=ak<a[k+1]....a[i]   k∈[1,i];

  所有从i个数中挑出k个来。

 

②dp[i][j] 表示: i个数中用了 j个 '<' 的个数。

  可以这样表示{1}<{2}<{3}..<{j+1}  一共j+1个块儿,每个块内的数是相等的。

  则状态转移方程就是 dp[i][j]=(j+1)*(dp[i-1][j]+dp[i-1][j-1]);

  分析:对于再来的第i个数x。

  可能存在两种可能。

  1,前i-1个数中存在了x,那么小于号不增加。。总数为 (j+1)*(dp[i-1][[j])

  2,不存在数等于x,那么会增加一个小于号。。x能放的位置有j+1个。。

     总数为 (j+1)*dp[i-1][j-1];

 

That 'is it