• Light OJ 1036


    题目大意:

    一个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
    ", cas ++, DFS(m,n));
    
        }
    
        return 0;
    }
  • 相关阅读:
    js-url打开方式
    eclipse删除所有空行
    Oracle重启 error: ora-01034:oracle not available ora-27101:shared memory realm does not exist
    最近面试遇到了高阶函数的概念混乱了
    关于跨域的cookie问题
    二叉树 呜呜
    函数的尾递归
    react context
    二叉树
    dom3级事件
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4913221.html
Copyright © 2020-2023  润新知