codeforces B. Cow Program (记忆化搜索)
2015-10-01 16:13
316 查看
题目链接:
codeforces 283B题目大意:
给出n个数,奇数次操作x,y都加上a[x],偶数次操作y加上a[x],x减去a[x],走出了范围就结束。问结束时的y值,如果无法结束,那么输出-1
题目分析:
记录状态dp[x][2]为在奇数次或偶数次到达x点时走完还会获得的权值。直接搜索,搜索到搜过的状态直接返回。
AC代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define MAX 200007 using namespace std; typedef long long LL; LL dp[MAX][2]; int vis[MAX][2]; int a[MAX],n; void dfs ( int x , int d ) { if ( vis[x][d%2] ) return; vis[x][d%2] = 1; if ( d&1 ) { int y = x-a[x]; if ( y <= 0 ) { dp[x][d%2] = a[x]; return; } dfs ( y , d+1 ); if ( dp[y][(d+1)%2] != -1 ) dp[x][d%2] = dp[y][(d+1)%2] + a[x]; } else { int y = x+a[x]; if ( y > n ) { dp[x][d%2] = a[x]; return; } dfs ( y , d+1 ); if ( dp[y][(d+1)%2] != -1 ) dp[x][d%2] = dp[y][(d+1)%2] + a[x]; } } int main ( ) { while ( ~scanf ( "%d" , &n ) ) { for ( int i = 2 ; i <= n ; i++ ) scanf ( "%d" , &a[i] ); memset ( vis , 0 , sizeof ( vis ) ); memset ( dp , -1, sizeof ( dp ) ); dp[1][0] = -1; vis[1][0] = 1; dp[1][1] = 0; vis[1][1] = 1; for ( int i = 2 ; i <= n ; i++ ) dfs ( i , 1 ); for ( int i = 2 ; i <= n ; i++ ) if ( dp[i][1] != -1 ) dp[i][1] += i-1; for ( int i = 2 ; i <= n ; i++ ) printf ( "%lld\n" , dp[i][1] ); } }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- JavaScript中数组的排序、乱序和搜索实现代码
- C#编程实现Excel文档中搜索文本内容的方法及思路
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值
- 可以用来搜索当前页面内容的js代码
- 全文搜索和替换
- javascript搜索自动提示功能的实现第1/3页
- mysql 模糊搜索的方法介绍
- C#搜索文字在文件及文件夹中出现位置的方法
- 基于ASP.NET的lucene.net全文搜索实现步骤
- 做个自己站内搜索引擎
- PHP查找与搜索数组元素方法总结