SRM 585
250 :
递推,从左下角到右下角走一条,剩下的都是子结构
const int mod = 1000000007;
long long dp[1000010] , s[1000010];
class
TrafficCongestion{
public :
int theMinCars(int n) {
long long ans = 0;
dp[0] = 1;
dp[1] = 1; s[0] = 1; s[1] =2;
REP(i,2,n) {
dp[i] = (1 + s[i-2] + s[i-2] ) % mod;
s[i] = (s[i-1] + dp[i]) % mod;
}
return dp[n];
}
};
500pt:
给你从小到大n种数字的个数,让你判断由全部的数字组成的序列中lisnum = k的有多少个。。lisnum就是一个序列递增的段数
dp[i][j] 表示前i种数产生了j个lisnum的数量,然后放上i+1种数时需要枚举放几个数放在那些递增段的后面,这样子放并不会增加lisnum的数量,假设放t个数在递增段的后面
那么现在总共有sum+1-j+t个位置是会增加lisnum的,我们要将剩下的cnt[i+1] - t个数放到这些位置去,就是高中的隔板法了
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef long long lld;
const int mod = 1000000007;
int dp[2][1500];
int C[1500][1500];
class LISNumber {
public :
int count(vector <int> cnt, int K) {
C[0][0] = 1;
for(int i = 1; i < 1500; i++) {
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; j++) {
C[i][j] = C[i-1][j] + C[i-1][j-1];
if(C[i][j] >= mod) C[i][j] -= mod;
}
}
dp[0][cnt[0]] = 1; int sum=cnt[0];
for(int i = 1; i < cnt.size(); i++) {
memset(dp[i&1],0,sizeof(dp[0]));
for(int j = 0; j <= K; j++) if(dp[(i-1)&1][j]) {
for(int t = 0; t <= min(cnt[i],j); t++) {
int box = sum + 1 - j + t;
int balls = cnt[i] - t;
dp[i&1][j+balls] += (lld)dp[(i-1)&1][j] * C[j][t] % mod * C[box-1+balls][balls] % mod;
if(dp[i&1][j+balls] >= mod) dp[i&1][j+balls] -= mod;
}
}
sum+=cnt[i];
}
return dp[(cnt.size()-1)&1][K];
}
}; // Powered by FileEdit
// Powered by TZTester 1.01 [25-Feb-2003]
// Powered by CodeProcessor
SRM 585的更多相关文章
- SRM 585 DIV1 L2
记录dp(i, j)表示前i种卡片的排列,使得LISNumber为j的方法数. #include <iostream> #include <vector> #include & ...
- SRM 585 DIV1
A 树形dp是看起来比较靠谱的做法 , 但是转移的时候不全面就会出错 , 从贪心的角度出发 , 首先让第一量车走最长路, 然后就会发现递归结构 , 得到递归式 f[i] = ( f[i-2] + f[ ...
- SRM 585 DIV 1 总结
题意:给你一棵高度为H的完全二叉树的路,问最少需要多少辆车把这路走完,车子不能返回. 那么最优的方案就是从小到上一层层的走完,就很容易地可以得到一种递推,需要注意的就是dp[0] = 1 #incl ...
- topcoder srm 585 div1
problem1 link 最优的策略就是从最低下一层开始,每两层的三个节点的子树都可以用一次遍历覆盖. problem2 link 从大到小依次放置每一种数字,并记录已经放置的数字一共有多少个$m$ ...
- SRM 585 DIV2
250pt: 一水... 500pt:题意: 给你一颗满二叉树的高度,然后找出出最少的不想交的路径并且该路径每个节点只经过一次. 思路:观察题目中给的图就会发现,其实每形成一个 就会存在一条路径. 我 ...
- Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1
据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- SRM 513 2 1000CutTheNumbers(状态压缩)
SRM 513 2 1000CutTheNumbers Problem Statement Manao has a board filled with digits represented as St ...
- SRM 510 2 250TheAlmostLuckyNumbersDivTwo(数位dp)
SRM 510 2 250TheAlmostLuckyNumbersDivTwo Problem Statement John and Brus believe that the digits 4 a ...
随机推荐
- QT实现appendSheet(QAxObject的一种Add + Move的方法)
一般地,熟悉VB.VC的同学都知道,要将新增的excel表单添加到表单的末尾,是很简单的事情,直接调用Add函数,传入对应的函数形参,就能实现将新增表单插入到末尾,但是通过QT的QAxObject实现 ...
- VM Agent 和扩展程序
VM Agent 和扩展程序 - 第 1 部分 Windows Azure基础结构服务最近宣布了一项新功能VM Agent.VMAgent是一个轻量级进程,用于启动由Microsoft或合作伙伴 ...
- 解决android加载图片时内存溢出问题
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过jav ...
- Cocos2d-x:环境配置小节
一.准备 须要下载下面内容. 1. vs2010 下载地址:http://download.microsoft.com/download/1/4/3/143B7583-6225-474F-88D5-5 ...
- HDU1046:Gridland
Problem Description For years, computer scientists have been trying to find efficient solutions to d ...
- linux多线程示例
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h& ...
- vim之执行shell命令
vim中执行shell命令,有以下几种形式 (1) :!command 不退出vim, 并执行shell命令command, 将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 (2) ...
- ADO.NET知识的运用一(Day 26)
哈哈,又到了总结的时间了,来回顾一下今天主要学了关于ADO.NET的哪些知识吧.(这次学的ADO访问数据库主要以访问SQL数据库为主) 理论: 首先我们要知道为什么要学习ADO.NET? 因为我们之 ...
- HTML,JAVASCRIPT代码美化demo
看见别人的博客里面的源码展示十分漂亮,一时兴起,就自己做了个. 当然,网上已经有别人做好的非常完善的codemirror.highlight.prettify.而我在写自己的这个小demo之前呢,也没 ...
- BZOJ 1034: [ZJOI2008]泡泡堂BNB( 贪心 )
贪心...用最弱的赢最弱的,用最强的赢最强的,否则用最弱的和最强的比... (贴个官方题解:将双方的选手均按从强到弱排序,然后第一次扫描尽可能用当前剩下的选手中能赢对手当前最强选手中最弱的一个去赢得胜 ...