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,那么概率最大的一定是一开始票数最多的人.因为这个人每一轮都在可以留下来的人群中 ...
随机推荐
- dorado7 重装了tomcat后配置路径
在Windows->Preferences->Server->Runtime Environments把先前的工程Servers删除掉
- map容器按value值排序
1 vector<pair<key,value> >类型的容器中存放所有元素,sort(pair默认按照value比较大小?) 2 map<value,key>
- libnet发包例子(tcp udp arp广播)
#include <libnet.h> int main() { libnet_t *handle; /* Libnet句柄 */ int packet_size; /* 构造的数据包大小 ...
- simple_factory
#include <stdlib.h> #include <iostream> using namespace std; class Product { public: vir ...
- Spring多数据源的动态切换
Spring多数据源的动态切换 目前很多项目中只能配置单个数据源,那么如果有多个数据源肿么办?Spring提供了一个抽象类AbstractRoutingDataSource,为我们很方便的解决了这个问 ...
- DTCMS,手机网站访问跳转到DTCMS官网解决方法
mobile\js\base.js main\js\common.js 去掉location.href = 'http://m.dtcms.net'; 也可以设定手机访问跳转到指定域名
- ActiveMq+zookeeper+levelDB集群整合配置
ActiveMq+zookeeper+levelDB集群整合配置 环境:linux系统,jdk1.7 三台linux系统电脑.我这里使用一台window,分别远程3台linux电脑.三台电脑的ip分 ...
- 几个好用的截取字符串的php函数分享
分享几个好用的PHP 截取字符串函数(支持gb2312和utf-8). 1.截取GB2312字符用的函数 <?php /** **截取中文字符串 * edit by www.jbxue.com ...
- C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen
据我所知,这是国外论坛最早的一个例子,原贴在此:http://forum.oberonplace.com/showthread.php?t=1880&highlight=Plugins 贴上主 ...
- DataGrid中取HyperLinkColumn列的值,处理DataGrid中绑定的特殊字符
DataGrid中取HyperLinkColumn列的值. /// <summary> /// 对datagrid中标签进行编码,处理特殊字符 /// </summary> / ...