lightoj 1036 - A Refining Company (dp)
题意:在一个m x n的地图里有金矿和银矿,当你在某个点(x, y)时, 你可以建造一个只能向西或者向北挖取矿石的履带车,金矿石只能被向北移动的履带车挖取,银矿石只能被向西移动的履带车挖取,并且履带车不能交叉。给出你每个地点的金矿和银矿的数量为你用履带车挖取的最大矿石数量是多少.(履带车会一直走到边界)
思路:
当你位于(x, y)时, 你只有两个操作:
1)建立一个向北运输的履带车,挖一路上的金矿石。
2)建立一个想西运输的履带车,挖一路上的银矿石。
定义dp[i][j] 从(i, j) 出发可以得到的最大矿石数量
于是有状态方程:dp[i][j] = max(dp[i-1][j] + a[0][i][j], dp[i][j-1] + a[1][i][j])
a[0][i][j]表示从(i, j)向西出发的履带车可以挖取的银矿石数量。
a[1][i][j]表示从(i, j)向北出发的履带车可以挖取的金矿石数量。
/************************************************ Author: fisty* Created Time: 2015-08-19 19:48:34* File Name : 1036.cpp*********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define lson l, m, k<<1
#define rson m+1, r, k<<1|1
#define MAX_N 550
int G[2][MAX_N][MAX_N];
int a[2][MAX_N][MAX_N];
int t;
int m, n;
int dp[MAX_N][MAX_N];
void init(){for(int i = 1;i <= m; i++){for(int j = 1;j <= n; j++){a[0][i][j] = a[0][i][j-1] + G[0][i][j];}}for(int i = 1;i <= m; i++){for(int j = 1;j <= n; j++){a[1][i][j] = a[1][i-1][j] + G[1][i][j];}}
}
int main() {//freopen("in.cpp", "r", stdin);//cin.tie(0);//ios::sync_with_stdio(false);scanf("%d", &t);int cnt = 1;while(t--){scanf("%d%d", &m, &n);for(int z = 0;z < 2; z++){for(int i = 1;i <= m; i++){for(int j = 1;j <= n; j++){scanf("%d", &G[z][i][j]);}}}init();for(int i = 1;i <= m; i++){for(int j = 1;j <= n; j++){dp[i][j] = max(dp[i][j-1] + a[1][i][j], dp[i-1][j] + a[0][i][j]);}}printf("Case %d: %d\n",cnt++, dp[m][n]);}return 0;
}
lightoj 1036 - A Refining Company (dp)相关推荐
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
- LeetCode 1220. 统计元音字母序列的数目(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...
- LeetCode 265. 粉刷房子 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...
- LeetCode 256. 粉刷房子(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...
- LeetCode 1223. 掷骰子模拟(DP)
1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- LeetCode 1139. 最大的以 1 为边界的正方形(DP)
1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量.如果不存在,则返回 0. 示例 1: 输入:grid ...
- 程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)
1. 题目 给定一个方阵,其中每个单元(像素)非黑即白. 设计一个算法,找出 4 条边皆为黑色像素的最大子方阵. 返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和 ...
最新文章
- SOTA论文也未必能被接收,谷歌科学家Eric Jang谈顶会审稿标准
- hdu 1043 Eight 搜索,哈希
- 使COUNT(*)查询总数变快
- 让网站具有生命与活力不仅仅是说说而已
- 【统计学习】参数估计
- 基于 EventBridge 构建 SaaS 应用集成方案
- 关闭word_Word教程第2讲:文档的基本操作(含视频)
- 面向全球用户的Teams app之夏令时篇
- java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流
- IDEA快捷键及xml文件中网址报错
- c 通过jni调用java_使用c通过jni调用java
- 犯病的chorme(谷歌浏览器)之css加载失败
- linux用户管理和文件权限
- Oracle数据库基础知识_数值类型及函数
- Ardoino L3G4200D 三轴数字陀螺仪测试
- Mac-录屏软件-视频转gif动图
- DGIOT国内首家轻量级物联网开源平台——真实电表接入实战教程
- 配置 Android 的 SDK, DNK, JDK, ANT 环境
- Android面试之J2SE基础
- 【电脑新硬盘如何分区】