每个房间有两个单向出口,就是只能进不能出,这个开始理解错了。

进入房间的时候,首先要在屋顶画一个叉叉,如果画完之后叉叉的个数是奇数的话:那么就从第二条出口出去,会到达p[ i ]房间;如果叉叉的个数是偶数的话,那么就到下一个房间。

问从1到n+1房间一共走了多少个这样的单项出口。

有一个条件:1 <= p[ i ] <= i 这个开始也没有注意到==。这是个很重要的条件。

说明人只能通过第二个出口向后退,而不能向前跳跃。如果人要向前走,只能一步一步的通过第一条出口。

所以,dp[ i ] 表示从i 房间到 i +1 房间需要经过的出口数。

还有一个特点:如果人第一次到房间 i ,那么他必定下一步到达房间p[ i ], 然后再考虑从房间p [ i ] 出发到达 p[ i +1] 房间。如果要到达i + 1房间。那么需要经过的出口数目就是:2 + dp[ p[i], p[i] + 1, ... , i - 1 ] .其中的2 就是从房间 i 到房间p[ i ] 和从房间 i 到房间 i + 1的两步。另外一部分也就是从房间p[ i ] 到房间p[ i ] +1 ,从房间p[ i ] + 1 到房间 p[ i ] + 2等等。

代码:

 /*
  * =====================================================================================
  *       Filename : LongPath.cpp
  *    Description : dp
  *    Version     : 0.1
  *        Created : 03/31/14 11:45
  *         Author : Liu Xue Yang (LXY), liuxueyang457@163.com
  *         Motto  : How about today?
  * =====================================================================================
  */
 #include <cstdio>
 #include <cstdlib>
 #include <iostream>
 #include <algorithm>
 using namespace std;

 /*
  * ===  FUNCTION  ======================================================================
  *         Name: main
  * =====================================================================================
  */
 ], p[];
 +;
     int
 main ( int argc, char *argv[] )
 {
     int n;
     scanf ( "%d", &n );
 //    printf ( "n = %d\n", n );
     ; i < n + ; ++i ) {
         scanf ( "%d", &p[i] );
 //        printf ( "%d\n", p[i] );
     }
     fill(dp, dp + n + , );
     dp[] = ;
     ; i < n + ; ++i ) {
         dp[i] = ;
         for ( int j = p[i]; j < i; ++j ) {
             dp[i] += dp[j];
             if ( dp[i] >= MOD ) {
                 dp[i] -= MOD;
             }
         }
     }
     ;
     ; i < n + ; ++i ) {
         sum += dp[i];
         if ( sum >= MOD ) {
             sum -= MOD;
         }
     }
     printf ( "%d\n", sum );

         return EXIT_SUCCESS;
 }                /* ----------  end of function main  ---------- */

看的tourist的代码

CodeForces 239 Long Path的更多相关文章

  1. codeforces D. Long Path

    http://codeforces.com/contest/408/problem/D 题意:有一排房间每个房间有两扇门,一扇通往第i+1个房间,另一扇通往第p[i]个房间,(p[i]<=i)然 ...

  2. Codeforces 938G Shortest Path Queries [分治,线性基,并查集]

    洛谷 Codeforces 分治的题目,或者说分治的思想,是非常灵活多变的. 所以对我这种智商低的选手特别不友好 脑子不好使怎么办?多做题吧-- 前置知识 线性基是你必须会的,不然这题不可做. 推荐再 ...

  3. Codeforces 407B Long Path(好题 DP+思维)

    题目链接:http://codeforces.com/problemset/problem/407/B 题目大意:一共n+1个房间,一个人从1走到n+1,每次经过房间都会留下一个标记,每个房间有两扇门 ...

  4. Codeforces 534B - Covered Path

    534B - Covered Path 思路:贪心,每一秒取尽可能大并且可以达到的速度. 画张图吧,不解释了: 代码: #include<bits/stdc++.h> using name ...

  5. codeforces 1072D Minimum path bfs+剪枝 好题

    题目传送门 题目大意: 给出一幅n*n的字符,从1,1位置走到n,n,会得到一个字符串,你有k次机会改变某一个字符(变成a),求字典序最小的路径. 题解: (先吐槽一句,cf 标签是dfs题????) ...

  6. Codeforces 762D Maximum path 动态规划

    Codeforces 762D 题目大意: 给定一个\(3*n(n \leq 10^5)\)的矩形,从左上角出发到右下角,规定每个格子只能经过一遍.经过一个格子会获得格子中的权值.每个格子的权值\(a ...

  7. CodeForces 762D Maximum path

    http://codeforces.com/problemset/problem/762/D 因为是3*n很巧妙的地方是 往左走两步或更多的走法都可以用往回走以一步 并走完一列来替换 那么走的方法就大 ...

  8. Codeforces 845G Shortest Path Problem?

    http://codeforces.com/problemset/problem/845/G 从顶点1dfs全图,遇到环则增加一种备选方案,环上的环不需要走到前一个环上作为条件,因为走完第二个环可以从 ...

  9. codeforces#1196F. K-th Path(最短路,思维题)

    题目链接: https://codeforces.com/contest/1196/problem/F 题意: 在无向图的所有最短路点对中,求出第$k$大 数据范围: $ 1 \leq k \leq ...

随机推荐

  1. web开发流程(传智播客-方立勋老师)

    1.搭建开发环境 1.1 导入项目所需的开发包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar commons-beanutils-1.8.0.jar commons-log ...

  2. Hive的内表和外表以及分区表

    1. 内表和外表的区别 内表和外表之间是通过关键字EXTERNAL来区分.删除表时: 内表:在删除时,既删除内表的元数据,也删除内表的数据 外表:删除时,仅仅删除外表的元数据. CREATE [EXT ...

  3. iOS的触摸事件的用法以及和手势识别器的区别

    1.首先来介绍下触摸事件和手势识别器的利与弊 触摸事件和手势识别器二者之间有直接的关系 手势识别器是在触摸事件的基础上演变过来的 当我们用到触摸事件时 默认的uiview是没有什么效果的 只能自定义v ...

  4. 样式PC和手机页面

    /*媒体查询--当页面大于1200px时*/ @media (min-width: 1200px) { } /*在922和1199像素之间的屏幕里,中等屏幕*/ @media (min-width: ...

  5. 修改Android系统属性SystemProperties.set("sys.powerctl", "shutdown")关机分析

    简介: 从之前的博文中我们提到过,关机流程中最后是通过修改Android属性进行关机操作(SystemProperties.java通过JNI调用访问系统属性),当然我们也可以通过adb命令修改And ...

  6. java开发命名规范

    使用前注意事项: 1.  由于Java面向对象编程的特性, 在命名时应尽量选择名词 2.  驼峰命名法(Camel-Case): 当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首 ...

  7. 支持向量机(SVM)——python3实现

    今天看完soft-margin SVM就又搜了下相关的代码,最后搜到这个,第一次看懂了SVM的实现. 关于代码中cvxopt的使用,可以看下这个简单的介绍. 这里还是将代码贴在这里,里面加了自己的一下 ...

  8. MAC解决端口占用

    1.前言 启用goagent.firefly等服务的时候,如果非正常退出,再次启动经常会遇到address already in use,端口被先前启动的服务进程所占用,导致服务无法使用.这种情况,可 ...

  9. EasyUI中Grid标题居中方法(jquery实现方法)

    $(".panel-title").css("text-align", "center"); 一句话搞定,就是这么随意

  10. Java(四)

    下面的代码可以实现以字节为单位复制文件的功能,适合复制非文本类型的文件,为了更清楚的观测运行速率,我加入了程序计时器,代码如下: import java.io.FileInputStream; imp ...