zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    ASIX配置vlan tag能被wireshark获取
    翻译-cmake教程
    Manjaro打造开发环境
    Frida入门
    安卓应用启动底层执行逻辑
    集合框架
    oracle清除日志内存
    flutter widgets目录
    给设备添加udid
    5.class
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4913221.html
Copyright © 2011-2022 走看看