博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷 P1070】道路游戏 (DP)
阅读量:7235 次
发布时间:2019-06-29

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

这题还是很好想的,看到\(90%\)的数据点时,我就知道要用\(n^3\)的算法(最后10分就算了吧)

然后,数据水,直接暴力\(n^3\)卡过了。

显然是道DP。

\(f[i]\)表示第\(i\)秒获取到的最多的金币。
三重循环更新状态。
第一重枚举机器人出发时间,
第二重枚举机器人出发地点,
第三重枚举机器人停止的时间。
很容易理解,看代码一下就懂了。

#include 
#include
#include
#define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);#define Close fclose(stdin);fclose(stdout);#define INF 2147483647using namespace std;const int MAXN = 1010;int tmp, n, m, p;int coin[MAXN][MAXN], f[MAXN], cost[MAXN];int getnext(int x){ tmp = (x + 1) % n; if(!tmp) tmp = n; return tmp;}int Min = INF;int main(){ //Open("game"); scanf("%d%d%d", &n, &m, &p); for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) scanf("%d", &coin[i][j]); for(int i = 1; i <= n; ++i) scanf("%d", &cost[i]), Min = min(Min, cost[i]); for(int i = 1; i <= m; ++i) f[i] = -Min; for(int i = 1; i <= m; ++i) for(int j = 1; j <= n; ++j){ int sum = 0, now = j; for(int k = i; k <= min(m, i + p - 1); ++k) f[k] = max(f[k], f[i - 1] + (sum += coin[now][k]) - cost[j]), now = getnext(now); } printf("%d\n", f[m]); return 0;}

转载于:https://www.cnblogs.com/Qihoo360/p/9639427.html

你可能感兴趣的文章
js的cookie操作
查看>>
Nginx 域名跳转配置
查看>>
手动分区来安装centos 5
查看>>
ASP.NET MVC扩展库
查看>>
pyodbc简单使用
查看>>
数据库厂商提供的 Providers for ASP.NET
查看>>
memcached演练(5) 内存管理
查看>>
烂泥:Windows server 2008开启远程桌面
查看>>
烂泥:IE10浏览器兼容模式
查看>>
我的家庭私有云计划-21
查看>>
Windows10-加速在企业中的部署
查看>>
综合应用WPF/WCF/WF/LINQ之三十八:实现一个简单的DataGrid之总体介绍
查看>>
Variant类型在各语言中的参数传递
查看>>
Exchange server 2003迁移到2010之升级默认地址簿及地址策略
查看>>
网站及监控利器 Pandora FMS使用体验
查看>>
JDK + Tomcat配置JSP开发环境
查看>>
NOKIA 6600 TIPS
查看>>
Linux/unix主机环回地址的一些功用
查看>>
Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
查看>>
Hyper-v虚拟化平台VDI 部署参考v1.0版
查看>>