题目链接:http://codeforces.com/problemset/problem/509/F

题意:

  告诉你遍历一棵树的方法,以及遍历节点的顺序a[i],长度为n。

  问你这棵树有多少种可能的形态。

  遍历方法:

    used[1 ... n] = {0, ..., 0};

    procedure dfs(v):

      print v;

      used[v] = 1;

      for i = 1, 2, ..., n:

        if (a[v][i] == 1 and used[i] == 0):

          dfs(i);

    dfs(1);

题解:

  表示状态:

    dp[i][j] = numbers

    表示a[i to j]这些节点,以a[i]为根所能构成的树的方案数。

  找出答案:

    ans = dp[1][n]

  如何转移:

    dp[i][j]一定以a[i]为根,且第一个访问的子节点一定是a[i+1]。

    所以将dp[i][j]分为三部分:

      (1)根节点a[i]

      (2)最左边的一棵子树a[i+1 to k]

      (3)右边剩下的一堆节点a[k+1 to j]

    那么根据乘法原理:

      dp[i][j] = ∑ dp[i+1][k]*右边一堆节点的方案数

    然而遍历是根据节点编号从小到大访问儿子节点的。

    这就要求,对于后面的一堆节点,如果其中某一个a[x]要和a[i+1]在同一层,那么一定要有a[i+1]<a[x]。

    又因为对于右边的一堆节点来说,最先访问到的肯定是a[k+1]。

    所以就是要保证:a[i+1]<a[k+1] or a[k+1]不存在

    这样就不用管后面的节点了,爱咋分咋分……

    接下来考虑如何求右边一堆节点的方案数。

    a[k+1 to j]形成森林的方法数 = a[k to j]以a[k]为根的子树的方法数。

    所以右边一堆节点的方案数 = dp[k][j]

    最终就是:

      if(a[i+1]<a[k+1] || k==j)

        dp[i][j] += dfs(i+1,k)*dfs(k,j);

      用记忆搜搞就行。

  边界条件:

    dp[i][i] = 1

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 505
#define MOD 1000000007 using namespace std; int n;
int a[MAX_N];
long long dp[MAX_N][MAX_N]; long long dfs(int i,int j)
{
if(i==j) return ;
if(dp[i][j]!=-) return dp[i][j];
dp[i][j]=;
for(long long k=i+;k<=j;k++)
{
if(a[i+]<a[k+] || k==j)
{
dp[i][j]+=dfs(i+,k)*dfs(k,j);
dp[i][j]%=MOD;
}
}
return dp[i][j];
} int main()
{
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
memset(dp,-,sizeof(dp));
cout<<dfs(,n)<<endl;
}

Codeforces 509F Progress Monitoring:区间dp【根据遍历顺序求树的方案数】的更多相关文章

  1. Codeforces 509F Progress Monitoring

    http://codeforces.com/problemset/problem/509/F 题目大意:给出一个遍历树的程序的输出的遍历顺序b序列,问可能的树的形态有多少种. 思路:记忆化搜索 其中我 ...

  2. CodeForces 149D Coloring Brackets 区间DP

    http://codeforces.com/problemset/problem/149/D 题意: 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2 ...

  3. Codeforces - 149D 不错的区间DP

    题意:有一个字符串 s. 这个字符串是一个完全匹配的括号序列.在这个完全匹配的括号序列里,每个括号都有一个和它匹配的括号 你现在可以给这个匹配的括号序列中的括号染色,且有三个要求: 每个括号只有三种情 ...

  4. codeforces 149D Coloring Brackets (区间DP + dfs)

    题目链接: codeforces 149D Coloring Brackets 题目描述: 给一个合法的括号串,然后问这串括号有多少种涂色方案,当然啦!涂色是有限制的. 1,每个括号只有三种选择:涂红 ...

  5. Codeforces.392E.Deleting Substrings(区间DP)

    题目链接 \(Description\) \(Solution\) 合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i| ...

  6. Codeforces 983B. XOR-pyramid【区间DP】

    LINK 定义了一种函数f 对于一个数组b 当长度是1的时候是本身 否则是用一个新的数组(长度是原数组-1)来记录相邻数的异或,对这个数组求函数f 大概是这样的: \(f(b[1]⊕b[2],b[2] ...

  7. CodeForces - 1025D: Recovering BST (区间DP)

    Dima the hamster enjoys nibbling different things: cages, sticks, bad problemsetters and even trees! ...

  8. Codeforces 1114D Flood Fill (区间DP or 最长公共子序列)

    题意:给你n个颜色块,颜色相同并且相邻的颜色块是互相连通的(连通块).你可以改变其中的某个颜色块的颜色,不过每次改变会把它所在的连通块的颜色也改变,问最少需要多少次操作,使得n个颜色块的颜色相同. 例 ...

  9. Codeforces 958C3 - Encryption (hard) 区间dp+抽屉原理

    转自:http://www.cnblogs.com/widsom/p/8863005.html 题目大意: 比起Encryption 中级版,把n的范围扩大到 500000,k,p范围都在100以内, ...

随机推荐

  1. hdu 1010 Tempter of the Bone 奇偶剪枝

      如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...

  2. mysql命令行导入和导出数据

    首先打开命令窗口,输入命令:mysql -h localhost -u selffabu -p 连接成功后,进行下面的操作 MySQL中导出CSV格式数据的SQL语句样本如下: select * fr ...

  3. 【Mac系统 + Python + Django】之搭建第一个【Django Demo(一)】

    我编写的此系列学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学 ...

  4. Http协议 详解(转载)

    http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分 ...

  5. 嵌入式开发之手机arm汇总---科普手机arm

    http://www.leiphone.com/news/201406/1102-zzl-arm.html

  6. 【Unity 3D】学习笔记四十二:粒子特效

    粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起.来模拟火焰,爆炸.水滴,雾气等效果. 要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system就可 ...

  7. 如何通过Google访问外网

    修改host: https://laod.cn/hosts/2017-google-hosts.html google中文: https://www.google.com.hk/ 弄好前两项后,可以再 ...

  8. 快捷标签和ajax、json返回数据

    <if 判断条件>标签</if><import>标签可以链接外部的样式表,和js<import file="js.util.Array" ...

  9. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...

  10. iview 表单相关

    view表单验证的步骤: 第一步:给 Form 设置属性 rules :rules第二步:同时给需要验证的每个 FormItem 设置属性 prop 指向对应字段即可 prop=”“第三步:注意:Fo ...