UVa 1366 DP Martian Mining

网上的题解几乎都是一样的:

d(i, j, 0)表示前i行前j列,第(i, j)个格子向左运输能得到的最大值。

d(i, j, 1)是第(i, j)个格子向上运输能得到的最大值。

但是有一个很关键的问题没有解释:

某个格子中的A矿或者B矿一定有其中一种能够运出来吗?有没有可能这个格子没有修建管道,仅仅是为了给其他管道让路,使得总体取得最大值呢?

从题解的状态转移方程上来看,不会的。

自己YY了好久,也没有想到一个能严格证明的方法。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int maxn = 500 + 10;
 8
 9 int A[maxn][maxn], B[maxn][maxn];
10 int d[maxn][maxn][2];
11
12 int main()
13 {
14     int n, m;
15     while(scanf("%d%d", &n, &m) && n)
16     {
17         for(int i = 1; i <= n; i++)
18             for(int j = 1; j <= m; j++) scanf("%d", &A[i][j]);
19         for(int i = 1; i <= n; i++)
20             for(int j = 1; j <= m; j++) scanf("%d", &B[i][j]);
21
22         for(int i = 1; i <= n; i++)
23             for(int j = 1; j <= m; j++) A[i][j] += A[i][j-1], B[i][j] += B[i-1][j];
24
25         for(int i = 1; i <= n; i++)
26             for(int j = 1; j <= m; j++)
27             {
28                 d[i][j][0] = max(d[i-1][j][0], d[i-1][j][1]) + A[i][j];
29                 d[i][j][1] = max(d[i][j-1][0], d[i][j-1][1]) + B[i][j];
30             }
31         printf("%d\n", max(d[n][m][0], d[n][m][1]));
32     }
33
34     return 0;
35 }

代码君

时间: 2024-10-16 13:50:12

UVa 1366 DP Martian Mining的相关文章

UVA 1366 九 Martian Mining

Martian Mining Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 1366 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 int dp[505][505][3]; 7

uva 1366(dp)

题意:有一个n*m的格子,每个格子里有A矿和B矿,A矿必须由右向左运输,B矿必须由下向上运输,给出两种矿在格子内的数量,挖矿人在每个格子里只能选一种矿挖,而且在格子内建运输管道不能拐弯或间断且都能通到格子外面.问最后能收集到的矿的总数最多多少. 题解:f[i][j][k]表示在前i行前j列第i行第j列挖k矿的最大数量,那么分两种情况 (1)第i行第j列挖A矿,那么(i,j)一定左边全是A矿,(i,j)上面可以是A也可以是B f[i][j][0] = max(f[i - 1][j][0], f[i

递推DP UVA 1366 Martian Mining

题目传送门 1 /* 2 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 3 到达边界后把沿途路上的权值相加求和使最大 4 DP:这是道递推题,首先我题目看了老半天,看懂后写出前缀和又不知道该如何定义状态好,写不出状态转移方程,太弱了. 5 dp[i][j]表示以(i, j)为右下角时求得的最大值,状态转移方程:dp[i][j] = max (dp[i-1][j] + sum1[i][j], dp[i][j-1] + sum2[i][j])

poj 2948 Martian Mining (dp)

题目链接 完全自己想的,做了3个小时,刚开始一点思路没有,硬想了这么长时间,想了一个思路, 又修改了一下,提交本来没抱多大希望 居然1A了,感觉好激动..很高兴dp又有所长进. 题意: 一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个 格子内的数量是多少.最北边有bloggium的收集站,最西边有 yeyenum 的收集站. 现在要在这些格子上面安装向北或者向西的传送带(每个格子自能装一种).问最多能采到多少矿. 传送带只能直着走,不可弯曲,不能交

POJ 2948 Martian Mining(DP)

题目链接 题意 : n×m的矩阵,每个格子中有两种矿石,第一种矿石的的收集站在最北,第二种矿石的收集站在最西,需要在格子上安装南向北的或东向西的传送带,但是每个格子中只能装一种传送带,求最多能采多少矿. 思路 :记忆化搜索.也可以用递推. //2948 #include <stdio.h> #include <string.h> #include <iostream> using namespace std ; int yeye[510][510] ,blog[510]

POJ 2948 Martian Mining

题目大意: NASA在火星发现了一个矿场矩阵.矩阵中的每个单元格都有两种矿Yeyenum和Bloggium.我们知道每个单元格中这两种矿的数量.NASA决定在北边建造Bloggium的矿石精炼厂,在西边建造Yeyenum的矿石精炼厂.于是需要我们把bloggium矿石向北运(行号等于0的方向),把Yeyenum矿石向西运(列号等于0的方向).但由于矿石的不稳定在建造传送带时有特殊要求.求建造传送带后两种矿石最多能收集多少. 解题思路: dp[i][j]代表着从(0,0)到(i,j)这两点间组成的

uva 1401 dp+Trie

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=4147 题意:给定一个字符串,以及若干单词,求有几种方式能用单词组成字符串 我先是dp方程推得有问题不知怎么修改搞得卡了很久,然后就是数组开得太小一直RE trie数组大小=单词个数*单词长度  dp[i]为以str[i]开头的后缀的ans,dp[i]=segma(

UVA - 1366 Martian Mining 三维dp

题目大意:在一个n * m的格子上有两种矿物.A矿只能从右往左运输,B矿只能从下往上运输,现在要求你在这格子上铺设管道(管道不能中断或者拐弯),用管道来运输A矿和B矿,使得运输的A矿和B矿的和最大 解题思路:设dp[i][j][0]为以(i,j)为矩阵的右下角,铺设从右往左的管道所能运输的最大值,那么第i行的第1列到第j列只能铺设从右往左的管道,所以dp[i][j][0] = max(dp[i-1][j][0],dp[i-1][j][1]) + A[i][j] 设dp[i][j][1]为以(i,

(中等) POJ 2948 Martian Mining,DP。

Description The NASA Space Center, Houston, is less than 200 miles from San Antonio, Texas (the site of the ACM Finals this year). This is the place where the astronauts are trained for Mission Seven Dwarfs, the next giant leap in space exploration.