记录dp(i, j)表示前i种卡片的排列,使得LISNumber为j的方法数。

#include <iostream>
#include <vector>
#include <string>
#include <string.h>
using namespace std; typedef long long int64; const int M = ; int64 dpC[][];
int64 dpT[][];
int64 sum[];
int64 dp[][]; class LISNumber {
private:
vector<int> num;
public:
int64 f(int i, int j);
int count(vector <int> cardsnum, int K);
}; int64 C(int m, int n) {
if (m == || n == || m == n) {
return ;
}
if (dpC[m][n] != -) {
return dpC[m][n];
}
return dpC[m][n] = (C(m - , n) + C(m - , n - )) % M;
} // m plate, n ball
int64 T(int m, int n) {
// m >= 1
if (m == || n == ) {
return ;
}
if (dpT[m][n] != -) {
return dpT[m][n];
}
return dpT[m][n] = (T(m - , n) + T(m, n - )) % M;
} int64 LISNumber::f(int i , int j) {
if (i == ) {
if (j == num[]) {
return dp[i][j] = ;
} else {
return dp[i][j] = ;
}
}
if (j < num[i] || j > sum[i]) {
return dp[i][j] = ;
}
if (dp[i][j] != -) {
return dp[i][j];
} // num[i] <= j <= sum[i]
dp[i][j] = ;
for (int k = ; k <= num[i]; k++) {
dp[i][j] += (((C(j - k, num[i] - k) * T(sum[i] + - j, k)) % M) * f(i - , j - k)) % M;
dp[i][j] %= M;
}
return dp[i][j];
} int LISNumber::count(vector <int> cardsnum, int K)
{
num = cardsnum;
memset(dp, -, sizeof(dp));
memset(dpC, -, sizeof(dpC));
memset(dpT, -, sizeof(dpT));
memset(sum, , sizeof(sum));
sum[] = cardsnum[];
for (int i = ; i < cardsnum.size(); i++) {
sum[i] = sum[i - ] + cardsnum[i];
}
return (int)f(cardsnum.size() - , K);
}

SRM 585 DIV1 L2的更多相关文章

  1. SRM 620 DIV1 L2

    题意:有n个等长的string(设string的长度为m),string中的字符从'A'到'Z',容许对m列执行稳定的排序操作,问说是否能通过这m种操作将这n个string调整成对应的顺序. 题解: ...

  2. SRM 585 DIV1

    A 树形dp是看起来比较靠谱的做法 , 但是转移的时候不全面就会出错 , 从贪心的角度出发 , 首先让第一量车走最长路, 然后就会发现递归结构 , 得到递归式 f[i] = ( f[i-2] + f[ ...

  3. topcoder srm 585 div1

    problem1 link 最优的策略就是从最低下一层开始,每两层的三个节点的子树都可以用一次遍历覆盖. problem2 link 从大到小依次放置每一种数字,并记录已经放置的数字一共有多少个$m$ ...

  4. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  5. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  6. 图论 SRM 674 Div1 VampireTree 250

    Problem Statement      You are a genealogist specializing in family trees of vampires. Vampire famil ...

  7. SRM 583 DIV1

    A 裸最短路. class TravelOnMars { public: int minTimes(vector <int>, int, int); }; vector<int> ...

  8. SRM 590 DIV1

    转载请注明出处,谢谢viewmode=contents">http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlov ...

  9. topcoder srm 500 div1

    problem1 link 如果decisions的大小为0,那么每一轮都是$N$个人.答案为0. 否则,如果答案不为0,那么概率最大的一定是一开始票数最多的人.因为这个人每一轮都在可以留下来的人群中 ...

随机推荐

  1. day 0.

    /* 嗯 就要结束了. OI生涯 2015.12-2016.11. 认识了很多人. 然后我这个学渣跟你们混在一起 感觉自卑至极啊. 好了 先不说这些伤心的话. Gryz小伙伴儿们NOIP RP++吧. ...

  2. uva247 - Calling Circles(传递闭包+DFS)

    题意:两人相互打电话(直接或间接),则在一个电话圈.即a给b打电话,b给c打电话,则a给c间接打电话. 注意:1.注意标记.2.注意输出格式. #include<iostream> #in ...

  3. Adobe Dreamweaver CS6 序列号 注册码(转自91zcm)

    Adobe Dreamweaver CS6  序列号 注册码: 1192-1632-4987-2281-1039-4334 1192-1697-0848-9963-2161-72481192-1871 ...

  4. C# login with cookie and fiddler2

    http://blog.codeblack.nl/post/HttpWebRequest-HttpWebResponse-and-cookies.aspx CookieContainer cookie ...

  5. CentOS平台下为Python添加MongoDB支持PyMongo

    下载PyMongo [root@leezhen ~]# wget https://pypi.python.org/packages/source/p/pymongo/pymongo-2.6.3.tar ...

  6. AngularJs--过滤器(filter)

    过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...

  7. ECSHOP 商品页详情页 添加同类随机商品

    1,根目录下找到goods.php文件 找到代码  $smarty->assign('properties',          $properties['pro']);             ...

  8. 完美解决IE6中fixed抖动问题的方法

    我们可以通过position:fixed来实现元素的固定效果,如网页中底部的"回到顶部菜单",底部的toolbar,对联广告等等,可惜fixed属性在IE6及以下是不支持的.通常的 ...

  9. Catalyst揭秘 Day7 SQL转为RDD的具体实现

    Catalyst揭秘 Day7 SQL转为RDD的具体实现 从技术角度,越底层和硬件偶尔越高,可动弹的空间越小,而越高层,可动用的智慧是更多.Catalyst就是个高层的智慧. Catalyst已经逐 ...

  10. js中的计时器

    在JS中做二级菜单时,被一个鼠标移出时隐藏的小问题困扰了很久. <script> function Menu(id){ var _this=this; this.obj=document. ...