洛谷 P1070 道路游戏 DP
题意:
有一个环,环上有n个工厂,每个工厂可以生产价格为x的零钱收割机器人,每个机器人在购买后可以沿着环最多走p条边,一秒走一条,每条边不同时间上出现的金币是不同的,问如何安排购买机器人,可以在m的时间内,得到最多的金币。
思路:
O(n^3)的算法,设DP[i] 为第 i 秒得到的最多金币,sum[ i ][ j ] 表示第 i 秒到 j工厂得到的金币值, cost[ i ]表示从第 i 个工厂买机器人的价格。
for(int i=; i<=m; i++){    //秒
       for(int k=; k<=min(i, p ); k++){
              for(int j=; j<n; j++){     //第i个工厂
                  dp[i] = max(dp[i], dp[i-k] + sum[i][j] - sum[i-k][(j-k+n) % n] - cost[(j-k+n) % n]);
              }
       }
}
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert> using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c);
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e9+;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
}
/*-----------------------showtime----------------------*/
const int maxn = ; int cost[maxn],dp[maxn], mp[maxn][maxn],sum[maxn][maxn]; int main(){
int n,m,p;
scanf("%d%d%d", &n, &m, &p); for(int i=; i<=n; i++) {
for(int j=; j<=m; j++){
scanf("%d", &mp[(i+) % n][j]);
}
} for(int i=; i<=n; i++) scanf("%d", &cost[i%n]); for(int i=; i<=m; i++){
for(int j=; j<n; j++){
sum[i][j] += sum[i-][(j-+n)%n] + mp[j][i];
}
} memset(dp, ~inf, sizeof(dp));
dp[] = ; for(int i=; i<=m; i++){ //秒
for(int k=; k<=min(i, p ); k++){
for(int j=; j<n; j++){ //第i个工厂
dp[i] = max(dp[i], dp[i-k] + sum[i][j] - sum[i-k][(j-k+n) % n] - cost[(j-k+n) % n]);
}
}
} printf("%d\n", dp[m]);
return ;
}
洛谷 P1070 道路游戏 DP的更多相关文章
- 【题解】洛谷P1070 道路游戏(线性DP)
		
次元传送门:洛谷P1070 思路 一开始以为要用什么玄学优化 没想到O3就可以过了 我们只需要设f[i]为到时间i时的最多金币 需要倒着推回去 即当前值可以从某个点来 那么状态转移方程为: f[i]= ...
 - 洛谷 P1070 道路游戏 解题报告
		
P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有\(n\)个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依 ...
 - 洛谷P1070 道路游戏
		
P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将 ...
 - 洛谷P1070 道路游戏(dp+优先队列优化)
		
题目链接:传送门 题目大意: 有N条相连的环形道路.在1-M的时间内每条路上都会出现不同数量的金币(j时刻i工厂出现的金币数量为val[i][j]).每条路的起点处都有一个工厂,总共N个. 可以从任意 ...
 - 洛谷 P1070 道路游戏(noip 2009 普及组 第四题)
		
题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn个机器人工厂编 ...
 - 洛谷 P1070 道路游戏
		
设为第i秒获得的最大值 表示从当前世界是j,从pos走k步到当前点i的最大价值 注意这里的sum可以利用前面的值逐步累加. 我开始做的时候没有想到这一点单独求,然后就超时了. 同时要注意循环的循序问题 ...
 - [luogu]P1070 道路游戏[DP]
		
[luogu]P1070 道路游戏 题目描述小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...
 - 洛谷 P2197 nim游戏
		
洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...
 - 洛谷 P1965 转圈游戏
		
洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...
 
随机推荐
- SQL语句中的as
 - umask 默认权限控制和特殊权限
			
权限简单介绍: 在Linux中,创建目录或者文件之后总会有默认的权限.共9个,分为三组.分别代表u.g.o(属主.属组.其他用户).r.w.x 也代表各自的权限. r:读 在文件中的权限代表次文件 ...
 - C#文件下载流程
			
private bool DownloadPicture(string picUrl, string savePath, int timeOut) { bool ...
 - 自定义FutureTask实现
			
FutureTask FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果.通过get()方法来获取异步任务的 ...
 - sql语句优化:尽量使用索引避免全表扫描
			
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
 - Java——集合类
			
1.容器的打印 import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import jav ...
 - java的八种数据类型
			
1)四种整数类型(byte.short.int.long): byte:8 位,用于表示最小数据单位,如文件中数据,-128~127 short:16 位,很少用,-32768 ~ 327 ...
 - 单机版ZooKeeper的安装教程
			
之前一直没有时间去整理,现在抽出几分钟时间整理以下,有问题的在评论区留言即可. 前期准备JDK环境(ZK需要jdk进行编译,本文以jdk1.8.0_211为例).Linux系统(本文以Centos7为 ...
 - 洛谷 P1903 [国家集训队]数颜色
			
题意简述 给定一个数列,支持两个操作 1.询问l~r有多少不同数字 2.修改某个数字 题解思路 带修莫队 如果修改多了,撤销修改 如果修改少了,进行修改 代码 #include <cmath&g ...
 - Spring 2017 Assignments1
			
一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment1/ 翻译:http://www.mooc.ai/course/268/lear ...