SRM 585 DIV1 L2
记录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的更多相关文章
- SRM 620 DIV1 L2
题意:有n个等长的string(设string的长度为m),string中的字符从'A'到'Z',容许对m列执行稳定的排序操作,问说是否能通过这m种操作将这n个string调整成对应的顺序. 题解: ...
- SRM 585 DIV1
A 树形dp是看起来比较靠谱的做法 , 但是转移的时候不全面就会出错 , 从贪心的角度出发 , 首先让第一量车走最长路, 然后就会发现递归结构 , 得到递归式 f[i] = ( f[i-2] + f[ ...
- topcoder srm 585 div1
problem1 link 最优的策略就是从最低下一层开始,每两层的三个节点的子树都可以用一次遍历覆盖. problem2 link 从大到小依次放置每一种数字,并记录已经放置的数字一共有多少个$m$ ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- SRM 583 DIV1
A 裸最短路. class TravelOnMars { public: int minTimes(vector <int>, int, int); }; vector<int> ...
- SRM 590 DIV1
转载请注明出处,谢谢viewmode=contents">http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlov ...
- topcoder srm 500 div1
problem1 link 如果decisions的大小为0,那么每一轮都是$N$个人.答案为0. 否则,如果答案不为0,那么概率最大的一定是一开始票数最多的人.因为这个人每一轮都在可以留下来的人群中 ...
随机推荐
- CAF(C++ actor framework)使用随笔(使用类去构建actor和使用的一些思路)
Class-based actorsA class-based actor is a subtype of event_based_actor and must implement the pure ...
- 动态链接库加载出错:cannot restore segment prot after reloc: Permission denied
在执行可执行程序时,出现动态链接库加载出错:cannot restore segment prot after reloc: Permission denied. 主要是由于Linux 内核中提供的强 ...
- Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)B一个简单的问题
题目描述 这是一个三层的字母塔. 如何输出一个任意层数的字母塔呢? 输入 一个数字n(1<=n<=26),表示字母塔的层数 注意 此题多组输入 输出 n层的字母塔 样例输入 3 4 样例 ...
- This bison version is not supported for regeneration of the Zend/PHP parsers
在 mac 中编译 php-src.git 报错: configure: WARNING: This bison version is not supported , excluded: ). con ...
- Jquery 控件
1. Jeditable 2. Select2 3. superfish 4. Jquery file upload https://blueimp.github.io/jQuery-File-Upl ...
- jQuery ui 中文日历
jQuery ui 中文日历 <link href="css/jquery-ui-1.10.4.custom.min.css" rel="stylesheet&qu ...
- php判断服务器是否支持Gzip压缩功能
Gzip可以压缩网页大小从而达到加速打开网页的速度,目前主流的浏览器几乎都支持这个功能,但开启Gzip是需要服务器支持的,在这里我们简单的使用php来判断服务器是否支持Gzip功能. 新建一个php类 ...
- asp.net mvc 伪静态路由配置
asp.net mvc实现伪静态路由必须按如下方式设置好,才能访问 .htm 或者.html页面 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspne ...
- oracle创建表空间、用户
创建表空间 create tablespace '<数据库名>' datafile '<存储路径>' size 500M default storage (initial 20 ...
- centos6.5安装配置LDAP服务[转]
安装之前查一下 1 find / -name openldap* centos6.4默认安装了LDAP,但没有装ldap-server和ldap-client 于是yum安装 1 su root 2 ...