题目链接:http://codeforces.com/problemset/problem/407/B

题目大意:
一共n+1个房间,一个人从1走到n+1,每次经过房间都会留下一个标记,每个房间有两扇门:
①第一扇门通向i+1,如果当前房间标记有奇数个,则必须走第一扇门。
②第二扇门通向pi(pi<=i),如果当前房间标记有偶数个,则必须走第二扇门。
问从房间1走到房间n+1需要多少步,结果对1e9+7取模。
解题思路:
之前傻了。。。明明都推出规律了,结果被自己给否定了。。。
设dp[i]表示从1~i需要走多少步,那么我们可以得到状态转移方程:
dp[i+1]=dp[i]+dp[i]-dp[p[i]]+2=2*dp[i]-dp[p[i]]+2
下面来解释一下,如果当前走到了i点,那么i点之前的所有点的标记数肯定都是偶数,因为只有标记为偶数才能往后走。
偶数可以看成是0,相当于跟第一次走一样。这里的2是因为从i到p[i]需要一步,从i到i+1需要一步。
从1~i为的步数为dp[i],然后返回p[i],从p[i]~i的步数为dp[i]-dp[p[i]],所以总步数就是dp[i]+dp[i]-dp[p[i]]+2=2*dp[i]-dp[p[i]]+2。

代码

 #include<bits/stdc++.h>
#define lc(a) (a<<1)
#define rc(a) (a<<1|1)
#define MID(a,b) ((a+b)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define clr(arr,val) memset(arr,val,sizeof(arr))
#define _for(i,start,end) for(int i=start;i<=end;i++)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long LL;
const int N=1e5+;
const int MOD=1e9+;
const int INF=0x3f3f3f3f;
const double eps=1e-; LL dp[N];
int p[N]; int main(){
FAST_IO;
int n;
cin>>n;
for(int i=;i<=n;i++){
cin>>p[i];
}
for(int i=;i<=n;i++){
dp[i+]=(*dp[i]-dp[p[i]]++MOD)%MOD;
}
cout<<dp[n+]<<endl;
return ;
}

最新文章

  1. 差分进化算法 DE-Differential Evolution
  2. 关于HTML5本地缓存技术LocalStorage 本地存储 和 SessionStorage
  3. jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween
  4. oracle 11g如何完全卸载
  5. Win10主题打不开,自动弹出桌面图标设置
  6. Java微框架:不可忽视的新趋势--转载
  7. 20151212Jquery 工具函数代码备份
  8. VS2008 Project : error PRJ0019: 某个工具从以下位置返回了错误代码: &quot;正在执行生成后事件...&quot;解决方案
  9. C语言面试题大汇总之华为面试题 Eddy整理
  10. ORACLE跨数据库查询的方法
  11. 又见thrift异常之TApplicationException: Internal error processing..
  12. 主成分分析法PCA原理
  13. sed修炼系列(二):sed武功心法(info sed翻译+注解)
  14. CSS——background-size实现图片自适应
  15. MongoDB集群配置笔记二(实战)
  16. NSString json 车NSDictionary
  17. amcharts categoryAxis
  18. Linux服务器部署系列之六—远程管理篇
  19. rabbitmq使用日记
  20. Linux下rz,sz与ssh的配合使用,实现文件传输

热门文章

  1. Django多域名配置之Django-hosts插件的使用
  2. Angular组件生命周期钩子
  3. 即将上线的Hive服务器面临的一系列填坑笔记
  4. nginx: [warn] duplicate MIME type &quot;text/html&quot;错误
  5. 已以用户 NT AUTHORITY\SYSTEM 的身份执行。 对象 名称 &#39;XXX&#39; 包含的前缀超出了最大限值。最多只能有 2 个。
  6. sublime 将打字内容放在屏幕中央
  7. Python异常处理和进程线程-day09
  8. 简易selenium自动化测试框架(Python)
  9. luogu 1196 银河英雄传说 带权并查集
  10. VS2013中修改MFC对话框左上角和exe图标