Light OJ 1036 - A Refining Company

题目大意:

一个m*n的矩阵,里面有两种矿物质铀和镭,现在要把铀和镭运送到指定位置。北边是炼镭厂,西边是了炼铀厂。
现在要建立传送带,传送带有两种,一种是从东到西,另一种是从南到北,传送带不能交叉,并且运送中途不能中断。现在你要计算出最多能采集多少矿。
输入数据:第一个m*n的矩阵代表铀的矿物质分布, 第二个矩阵代表镭的矿物质分布。
题目分析:
记忆化搜索写起来比较方便点,把数据进行一下简单的预处理就行了。
 
 
 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int INF = 1e9+7;
const int MAXN = 555;
int dp[MAXN][MAXN];
int Ur[MAXN][MAXN], Ra[MAXN][MAXN];

int DFS(int m,int n)
{
    if(dp[m][n] != -1)
        return dp[m][n];
    if(m == 0 || n == 0)
        return dp[m][n] = 0;

    dp[m][n] = max(dp[m][n], Ra[m][n] + DFS(m,n-1) );///选取镭
    dp[m][n] = max(dp[m][n], Ur[m][n] + DFS(m-1,n) );///选取铀
    return dp[m][n];
}

int main()
{
    int T, n, m, a, cas = 1;
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d %d", &m, &n);

        memset(Ur, 0, sizeof(Ur));
        memset(Ra, 0, sizeof(Ra));
        memset(dp, -1, sizeof(dp));
        for(int i=1; i<=m; i++)
        for(int j=1; j<=n; j++)
        {
            scanf("%d", &a);
            Ur[i][j] = Ur[i][j-1] + a;
        }


        for(int i=1; i<=m; i++)
        for(int j=1; j<=n; j++)
        {
            scanf("%d", &a);
            Ra[i][j] = Ra[i-1][j] + a;
        }
        printf("Case %d: %d\n", cas ++, DFS(m,n));

    }

    return 0;
}

 

posted @ 2015-10-27 09:32  向前走丶不回首  阅读(133)  评论(0编辑  收藏  举报