博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
505C Mr. Kitayuta, the Treasure Hunter
阅读量:7210 次
发布时间:2019-06-29

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

题目大意

一共有30000个位置,从第0个位置开始走,第一次走k步,对于每一次走步,可以走上一次的ki+1 ,ki ,ki-1步数(必须大于等于1),每个岛上有value,求最大能得到的value能有多少。

分析

首先我们不难想到dpij表示走到第i个位置,上次走的步数为j,然而30000*30000时间复杂度和空间复杂度都会爆炸,所以我们考虑如何优化掉一维,然而我们发现是无法优化掉一维的。

但由于一个只有30000个位置,所有我们想到上次走的步数的所有可能情况可能不是很多,由式子d+(d+1)+(d+2)+…+(d+maxl)≤30000可得maxl大致是250,也就是说上次走的步数最少是d-250,最多是d+250.于是我们得到dpij,其中i表示考虑到第i个位置,j表示上次走的长度-d,注意为了防止数组出现负数我们将第二维统一加上maxl。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define sp cout<<"---------------------------------------------------"<
0) dp[i+j+d][j+maxl]=max(dp[i+j+d][j+maxl],dp[i][j+maxl]+cnt[i+j+d]); if(j+d-1>0&&i+j+d-1<=N&&j-1>=-maxl) dp[i+j+d-1][j-1+maxl]=max(dp[i+j+d-1][j-1+maxl],dp[i][j+maxl]+cnt[i+j+d-1]); if(j+d+1>0&&i+j+d+1<=N&&j+1<=maxl) dp[i+j+d+1][j+1+maxl]=max(dp[i+j+d+1][j+1+maxl],dp[i][j+maxl]+cnt[i+j+d+1]); } int ans=0; for(i=0;i<=N;i++)for(j=-maxl;j<=maxl;j++)ans=max(ans,dp[i][j+maxl]); cout<
<

转载于:https://www.cnblogs.com/yzxverygood/p/9292707.html

你可能感兴趣的文章
1.1.3 Getting Started_Budding Your First App_Building a Simple User Interface
查看>>
学习日记0907 GIL全局解释器锁 死锁与递归锁 信号量 Event事件 线程的queue
查看>>
linux awk函数
查看>>
性能测试
查看>>
阿里云服务器Linux CentOS安装配置(六)resin多端口配置、安装、部署
查看>>
jQuery对象与DOM对象之间的转换(转)
查看>>
asp.net跳转页面的三种方法比较
查看>>
Bzoj1076 [SCOI2008]奖励关
查看>>
JCo 指南
查看>>
git使用--pull代码时冲突
查看>>
1-3-1动态随屏幕变化而变化
查看>>
Reading papers_6(Pattern Recognition And Machine Learning一书,ing...)
查看>>
java mybatis 新增记录 与 insertSelective 保存问题
查看>>
cocos2d-x 搭建android开发环境记录
查看>>
列表与元组的区别
查看>>
关于野指针、空指针
查看>>
key_buffer_size设置注意事项
查看>>
C#对各种文件的操作-ini(2)
查看>>
JavaScript入门学习笔记(二)
查看>>
Project Euler 13 Large sum
查看>>