codeforces 407B Long Path

题意:一些点排成一列,只有访问 i  偶数次以后才能访问 i+1,否则访问pi

解题思路:我们知道 ,当我们访问  i 的时候  i 前面所有的点必定为偶数,所以 访问 i 以后 访问到 i+1 的步数 dp[i] = dp[pi] + dp[pi+1]+.....dp[i-1] + 2;

解题代码:

 1 // File Name: 407b.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月07日 星期六 11时36分30秒
 4
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 #define M 1000000007
26 using namespace std;
27 LL dp[1005];
28 int main(){
29     int n;
30     scanf("%d",&n);
31     int tmp;
32     dp[1] = 2;
33     scanf("%d",&tmp);
34     LL sum = 1;
35     for(int i = 2;i <= n;i ++)
36     {
37       scanf("%d",&tmp);
38       dp[i] = 2;
39       for(int j = tmp ;j < i ;j ++)
40       {
41          dp[i] = (dp[i] +dp[j])%M;
42       }
43       sum = (sum +dp[i])%M;
44     }
45     printf("%I64d\n",(sum+1)%M);
46 return 0;
47 }

时间: 2024-10-14 20:24:01

codeforces 407B Long Path的相关文章

CodeForces 407B Long Path (DP)

题目链接 题意:一共n+1个房间,一个人从1走到n+1,如果第奇数次走到房间i,会退回到房间Pi,如果偶数次走到房间i,则走到房间i+1,问走到n+1需要多少步,结果对1e9+7取模. 题解:设dp[i]表示从1走到i需要多少步,那么走到房间i+1需要dp[i+1]=dp[i]+1+x+1,这里面第一个1表示走完这步退回到Pi,这个x表示退回到房间Pi再走回来的步数,第二个1表示走完这步到达i+1.我们发现:1.当走到房间Pi的时候,Pi+1到i都是没有走过的即为0次:2.当走到房间i的时候,P

CodeForces 407B 简单dp

//CodeForces 407B 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 using namespace std; 6 const __int64 mod = 1e9 + 7; 7 __int64 dp[1010]; 8 int pos[1010], n; 9 10 int main() 1

CodeForces - 407B

Long Path Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status Description One day, little Vasya found himself in a maze consisting of (n + 1) rooms, numbered from 1 to (n + 1). Initially, Vasya is at the first r

CodeForces 762D Maximum path

http://codeforces.com/problemset/problem/762/D 因为是3*n很巧妙的地方是 往左走两步或更多的走法都可以用往回走以一步 并走完一列来替换 那么走的方法就大大减少 左边一列转移到右边一列 每个 格子的转移方法枚举出来 用动态规划即可解决 最主要的是因为他能够往回走.但是我们画图可以发现:每次往回走一定不用超过1次.也就是说,最多只能走成这样 而不会走成这样 因为下图的走法一定可以用上图组合,并且由于只用3行的特性,每次向回走实际上是取走了所有的数.所以

Codeforces 534B Covered Path(贪心)

题意  你在路上走 每秒钟的开始都可以改变自己的速度(改变速度都是瞬间完成的)  知道你开始的速度v1 结束时的速度v2  整个过程所用时间t  以及每秒最多改变的速度d  求这段时间内你最多走了多远 最优的肯定是先把速度从v1升到最大  然后从最大减到v2  使得用的时间不会超多t   因为肯定是足够从v1减为或升到v2的   那么我们只用从两端往中间靠  哪边的速度小  哪边就加上d  知道两边相邻  这样就能保证每次改变的速度都最大  而且最后两端的速度差也不会大于d  也就是最优答案了

Codeforces 534B - Covered Path

534B - Covered Path 思路:贪心,每一秒取尽可能大速度. 画张图吧,不解释了: 代码: #include<bits/stdc++.h> using namespace std; #define ll long long int dp[105],dp1[105]; int main() { ios::sync_with_stdio(false); cin.tie(0); int v1,v2,t,d; cin>>v1>>v2>>t>>

codeforces 1072D Minimum path bfs+剪枝 好题

题目传送门 题目大意: 给出一幅n*n的字符,从1,1位置走到n,n,会得到一个字符串,你有k次机会改变某一个字符(变成a),求字典序最小的路径. 题解: (先吐槽一句,cf 标签是dfs题????) 这道题又学到了,首先会发现,从原点出发,走x步,所有的情况都是在一条斜线上的,而再走一步就是下一条斜线.所以用两个队列进行bfs(把当前步和下一步要处理的字符分开). 到了这里思路就明朗了,每次走的时候如果本身的map里是a就直接走,不是a就看k是否大于0,再看这个字符是不是比答案串里对应位置的字

Codeforces gym101755H Safe Path(bfs)

题意: 给以一个网格图,有起点终点和一些怪兽,可以上下左右走,不能走到距离怪兽曼哈顿距离为d以内的地方,问到终点最短路径 n*m<=2e5,d<=2e5 思路: 因为n*m的范围,不能直接建2e5*2e5的图,所以要vector.resize() 如果对每个怪兽都预处理的话,复杂度将是O(d2) 所以我们可以让所有怪兽同时走,这样预处理只有O(nm),也可以证明不会漏情况 代码: #include<iostream> #include<cstdio> #include&

Codeforces 938G 线段树分治 线性基 可撤销并查集

Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问x到y的路径异或最小值 保证图在任意时刻连通 首先连通图路径异或相当于从x到y的任意一条路径再异或上若干个环得到的,只要在dfs过程中把非树边成的环丢到线性基里就好了,其他环一定可以通过这些环异或组合出来 有加边删边操作怎么做呢?线段树时间分治!注意到不能保证在线段树的任意一个节点图是连通的,需要用