题意:对于[l1, r1], [l2, r2]...[lm, rm]线段组成的一个集合S,我们定义f(S)为最大的不相交(没有任何公共点)线段数,现在给定n及k,n表示线段范围,即任何[li, ri]有1<=li<=ri<=n,求有多少个集合使得f(S) = k。

思路:刚看到题目感觉不会,也就不多想。。

突然问了下小胖,小胖说他做过,不难。。然后我就慢慢想了。。

仔细想想,确实不难。。

假设现在已经给定了一个S,那么我们怎么求f(S)?

很显然,我们可以贪心,按照r排序,那么我们每次只要取最小r的线段,删除覆盖的,依次做完最后取到的线段肯定最多。。

这么以来对于任意一个集合S,我们肯定可以用最小的有用线段的右端点r来表示其状态。。

所以用f[i][j]表示最后一个有用线段右端点为i,最长有j段不相交的线段的方案数

则递推到f[k][j+1](k>i)的状态有:

在【i+1, k】区间内一定选了至少一条以k为右端点的线段,选法2k-i - 1

左端点在【1, i】右端点【i+1, k】的线段可以任意选不影响f值,有2(k-i)*i

所以 f[k][j+1] += f[i][j] *(2k-i - 1) * 2(k-i)*i

code:

 #include <bits/stdc++.h>
#define M0(x) memset(x, 0, sizeof(x))
#define M 1000000007
using namespace std;
typedef long long ll;
const int maxn = ;
int n, m;
ll dp[][], p[]; void solve(){
if (m == ){
puts("");
return;
}
M0(dp);
dp[][] = ;
p[] = ;
for (int i = ; i <= n * n; ++i) p[i] = (p[i-] << ) % M;
ll tmp;
int c = ;
for (int i = ; i < n; ++i)
for (int j = ; j < m; ++j) if (dp[i][j]){
c = ;
for (int k = i+; k <= n; ++k){
c += i;
tmp = dp[i][j] * (p[(k - i)]-) % M * p[c] % M;
dp[k][j+] = (dp[k][j+] + tmp) % M;
}
}
ll ans = ;
for (int i = ; i <= n; ++i){
tmp = p[(n-i) * i] * dp[i][m] % M;
ans = (ans + tmp) % M;
// printf("%d : %lld\n",i, ans);
}
cout << ans << endl;
} int main(){
freopen("a.in", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF){
solve();
}
return ;
}

codeforces 425E的更多相关文章

  1. CodeForces 425E Sereja and Sets

    意甲冠军: 集S它包括了很多间隔[l,r]  和1<=l<=r<=n  f(S)个不相交的区间  问给出n和f(S)  有几种可能的S集合 思路: dp好题  至于为啥是dp-  我 ...

  2. Codeforces 425E Sereja and Sets dp

    Sereja and Sets 我们先考虑对于一堆线段我们怎么求最大的不相交的线段数量. 我们先按 r 排序, 然后能选就选. 所以我们能想到我们用$dp[ i ][ j ]$表示已经选了 i 个线段 ...

  3. CodeForces - 425E Sereja and Sets 题解

    题目大意: 我们有一个集合 S,其中包含了 m 个不完全相同的区间[l1,r1],[l2,r2]…[lm,rm] (1≤li≤ri≤n,li,ri 都为整数). 定义 f(S)=k,表示集合 S 中能 ...

  4. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  7. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  8. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  9. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

随机推荐

  1. 窗口 超类化 子类化 HOOK

    body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { colo ...

  2. Eclipse下修改工程名

    汇总下网上的方法. 一. 右键工程:Refactor->Rename,或选中工程按F2,修改名称 二. 右键工程:Properties->Web Project Settings,修改Co ...

  3. delphi 10 seattle 安卓服务开发(二)

    关于delphi 10 移动服务开发的几张图

  4. SQL常用代码收集

    1.存储过程中,使用in查询时的参数处理方式 使用情形描述:传入存储过程的参数为一个字符串@IDs,以固定分隔符连接 新建字符串分割函数,然后将分割结果传入存储过程: CREATE FUNCTION ...

  5. P2001xor-sigma 字典树,然而好坑

    https://vijos.org/p/2001 设perXor[i]表示1---i的前缀异或值. 那么要得到某一段的异或值,只需要perXor[j] ^ perXor[i - 1] 那么我们把per ...

  6. HTML5和CSS3基础教程(第8版)-读书笔记(4)

    第16章 表单 表单有两个基本组成部分:访问者在页面上可以看见并填写的控件.标签和按钮的集合:以及用于获取信息并将其转化为可以读取或计算的格式的处理脚本. 基本的表单字段类型包括文本框.单选按钮.复选 ...

  7. EnterpriseLibrary 6.0中DAAB独立数据库配置文件初始化

     string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "database.config");  IC ...

  8. expdp小记

    一.10.2.0.5要求expdp导出a用户b表空间下的数据. expdp \'/ as sysdba\' directory=mydir dumpfile=1.dmp schemas=a exclu ...

  9. [转载] 散列表(Hash Table) 从理论到实用(下)

    转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...

  10. mysql: symbol lookup error: /usr/local/lib/libreadline.so.6: undefined symbol: UP

    Error Symptom: when you run $mysql -u root -p command in the linux you get an error message ” mysql: ...