博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces B. Cow Program (记忆化搜索)
阅读量:3713 次
发布时间:2019-05-21

本文共 1449 字,大约阅读时间需要 4 分钟。

题目链接:


题目大意:

给出n个数,奇数次操作x,y都加上a[x],偶数次操作y加上a[x],x减去a[x],走出了范围就结束。

问结束时的y值,如果无法结束,那么输出-1


题目分析:

  • 记录状态dp[x][2]为在奇数次或偶数次到达x点时走完还会获得的权值。
  • 直接搜索,搜索到搜过的状态直接返回。

AC代码:

#include 
#include
#include
#include
#define MAX 200007using 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] ); }}

转载地址:http://aqvjn.baihongyu.com/

你可能感兴趣的文章
头文件的建立
查看>>
STM32—常用的几种伪指令宏
查看>>
STM32—位带操作
查看>>
Keil5中出现中文乱码的解决方法
查看>>
【写一个操作系统】1—hello world重出江湖
查看>>
【写一个操作系统】2—VMware创建软盘映像
查看>>
STM32—SPI读写FLASH
查看>>
【写一个操作系统】3—汇编语言学习及Makefile入门
查看>>
const关键字用法
查看>>
extern关键字用法
查看>>
红外遥控小车
查看>>
FTP(vsftp)服务器的搭建配置以及访问控制
查看>>
python实现的简单点对点(p2p)聊天
查看>>
nwjs node-webkit 桌面app自定义窗体事件 nwjs托盘tray的实现
查看>>
后端使用pyecharts画图并输出为图片保存
查看>>
nodejs日志读取 日志查找 日志刷新
查看>>
GB2312汉字拼音对照表
查看>>
手机 用户界面和多媒体 版面有价值问题整理 j2medev com 0406更新
查看>>
SP 梦网masterSP模式下的sp生存
查看>>
dotNET ThreadPool 对象中没有足够的自由线程来完成操作 的现象和解决办法
查看>>