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,那么概率最大的一定是一开始票数最多的人.因为这个人每一轮都在可以留下来的人群中 ...
随机推荐
- ZigBee NV层使用
原文转载于http://www.cnblogs.com/yqh2007/archive/2011/05/31/2065284.html 系统NV区:初始化nv数据项 osal_nv_item_in ...
- KMeans聚类算法Hadoop实现
Assistance.java 辅助类,功能详见注释 package KMeans; import org.apache.hadoop.conf.Configuration; import org. ...
- google其他入口地址
http://178.45.251.74/ http://64.233.166.51/ http://61.19.1.117/ http://64.233.166.42/ http://61.19.1 ...
- Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)
Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)
- .vimrc & .bashrc 文件配置
/* 如果vim还没有语法高亮,那么在/etc/profile 中添加以下语句 */ export TERM=xterm-color // 注: 只对各个用户自己的主目录下的.vimrc修改的话,修改 ...
- Kinetic使用注意点--circle
new Circle(config) 参数: config:包含所有配置项的对象. { radius: "半径", fill: "填充色", fillRGB: ...
- Java 多线程 简单实例 (消费者与生成者)的关系
PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习: PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧! 1.定义生产消费环境 package second; pub ...
- 收录一个简单的css类库
/* CSS liberary */.yahei { font-family: "Microsoft Yahei", "Tahoma", "Si ...
- HTML标签<b>与<strong>以及<i>与<em>的区别
在一般情况下,<b>和<strong>标签的显示效果一样,<i>和<em>标签的显示效果一样.那么它们的区别在哪呢?我们应该使用哪种标签呢? 在w3sc ...
- RE:转:一些不常用的html代码
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...