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,那么概率最大的一定是一开始票数最多的人.因为这个人每一轮都在可以留下来的人群中 ...
随机推荐
- emacs_1
--> 正在处理依赖关系 perl(VMS::Filespec),它被软件包 perl-PathTools-3.2701-1.el5.rf.x86_64 需要---> 软件包 perl-p ...
- JBoss部署项目log4j配置会造成死锁问题,浏览器访问一直pending状态
今天将项目部署到JBoss服务器上,部署成功后,浏览器访问页面一直在等待响应. 查了很长时间,最后在服务器上通过jstack pid命令查看Java堆栈信息,发现了有两个线程死锁. 看到造成死锁的原因 ...
- C#编写记事本(高仿)
近一周写的关于记事本的代码,高仿记事本.本人C#入门不久,其中存在代码冗余,但懒得修改了. 经测试运行正常. 一.主窗体设计及代码 namespace BestEditor { public part ...
- System.UnauthorizedAccessException: 拒绝访问 temp 目录。用来运行 XmlSerializer 的标识“NT AUTHORITY\NETWORK SERVICE”没有访问 temp 目录的足够权限。CodeDom 将使用进程正在使用的用户帐户进行编译,这样,如
解决方案:IIS的应用程序池权限不够,应用程序给localsystem账号权限即可. 以客户的服务器系统2003sp2为例,修改步骤如下: 控制面板---管理工具--Internet 信息服务(IIS ...
- Wpf 简单制作自己的窗体样式
最近一直在搞wpf相关的东东,由于还在门外徘徊,所以第一篇blog写了简单的制作扁平化的wpf button样式,这一篇也简单的制作属于自己wpf 窗体的样式. 废话少说,下面就开始制作自己的窗体样式 ...
- php校验
//校验function filters($grams){ if(get_magic_quotes_gpc()) { $resgram = trim($grams); ...
- cadence 封装制作小结
assembly :是装配层,就是元器件的实际大小,用来产生元器件的装配图.也可以使用此层进行布局:外框尺寸应该为元件除焊盘外的部分 该区域可比silkscreen小10mil,线宽不用设置,矩形即可 ...
- PID控制器的数字实现及C语法讲解
PID控制器的数字实现及C语法讲解 概述 为方便学习与交流,根据自己的理解与经验写了这份教程,有错误之处请各位读者予以指出,具体包含以下三部分内容: (1) PID数字化的推导过程(实质:微积分的近 ...
- mac OS X 10.9.1 配置jdk环境变量
进入命令行 cd ~ touch .bash_profile vi .bash_profile 输入内容jdk变量配置内容: export JAVA_HOME=/Library/Java/JavaVi ...
- 【linQ】DataContext 入门 , 和 hql , jpql 一样好用
DataContext 和 LINQ结合后会有巨大的能量 public class UserDataContext : DataContext { public Table<User> U ...