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

进入房间的时候,首先要在屋顶画一个叉叉,如果画完之后叉叉的个数是奇数的话:那么就从第二条出口出去,会到达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. GitLab在Centos下的安装步骤

    第一步:(安装工具包) sudo yum install curl openssh-server postfix cronie sudo service postfix start sudo chkc ...

  2. SpringMVC与MyBatis整合(一)——查询人员列表

    从今天开始,一点点的记录做毕设和学习的过程. 寒假才开始接触SpringMVC和MyBatis,之前对框架的概念理解并不到位,也没学过Spring.目前学习起来思路并不很清晰,有些东西我还不能理解,只 ...

  3. ServiceStack V3 版本 免费 redis的操作类

    Referencing v3 packages in New Projects If you want a new project to use ServiceStack's v3 packages ...

  4. Unity3D之GUITexture的坐标体系

    Unity3D的GUITexture的坐标,其中x和y的取值在0~1之间,层次使用z来划分,值越大越靠前.

  5. Asp.net MVC与Javascript

    特性验证 首先:在web.config文件中<appSettings>节点内添加<add key="ClientValidationEnabled" value= ...

  6. hibernate 返回新插入数据的Id

    例如 表明 studentInfo String sql="set set nocount on studentInfo(列名,列名) values('值','值');select @@id ...

  7. C#和Java在重写上的区别

    C# class A { public string Get1() { return "A1"; } public virtual string Get2() { return & ...

  8. ko 简单例子

    Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...

  9. 为什么匿名内部类参数必须为final类型

    1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自 ...

  10. Servlet向客户端发送中文数据的编码情况

    (更多内容请关注本人微信订阅号:it_pupil) 本文讲述服务端servlet向客户端浏览器发送中文数据的编码情况,需要抓住下面几点: 输出流发送数据,必须是以字节形式传输的.也就是说,如果你在服务 ...