• 51nod 1084 矩阵取数问题 V2


    基准时间限制:2 秒 空间限制:131072 KB 
     
    一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上。第1遍时只能向下和向右走,第2遍时只能向上和向左走。两次如果经过同一个格子,则该格子的奖励只计算一次,求能够获得的最大价值。
     
    例如:3 * 3的方格。
     
    1 3 3
    2 1 3
    2 2 1
     
    能够获得的最大价值为:17。1 -> 3 -> 3 -> 3 -> 1 -> 2 -> 2 -> 2 -> 1。其中起点和终点的奖励只计算1次。
     
    Input
    第1行:2个数M N,中间用空格分隔,为矩阵的大小。(2 <= M, N <= 200)
    第2 - N + 1行:每行M个数,中间用空格隔开,对应格子中奖励的价值。(1 <= A[i,j] <= 10000)
    Output
    输出能够获得的最大价值。
    Input示例
    3 3
    1 3 3
    2 1 3
    2 2 1
    Output示例
    17

    可以看成是两条路径同时从起点出发,到达终点,似乎不用滚动数组就能解决,我也懒得优化了,一遍AC
    dp[i][j][k],表示两条路径从起点到(i,j)和(k,i+j-k)的最大价值.

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<map>
    #include<cmath>
    #include<set>
    #include<stack>
    #define ll long long
    #define max(x,y) (x)>(y)?(x):(y)
    #define min(x,y) (x)>(y)?(y):(x)
    #define cls(name,x) memset(name,x,sizeof(name))
    using namespace std;
    const int inf=1<<28;
    const int maxn=210;
    const int maxm=110;
    const int mod=1e9+7;
    const double pi=acos(-1.0);
    int dp[maxn][maxn][maxn];
    int num[maxn][maxn];
    int n,m;
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(~scanf("%d%d",&m,&n))
        {
            cls(dp,0);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                scanf("%d",&num[i][j]);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    for(int k=1;k<=n;k++)
                    {
                        if(i!=k)
                        {
                            dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]+num[i][j]+num[k][i+j-k]);
                            dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]+num[i][j]+num[k][i+j-k]);
                            dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k-1]+num[i][j]+num[k][i+j-k]);
                            dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k]+num[i][j]+num[k][i+j-k]);
                        }
                        else
                        {
                            dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]+num[i][j]);
                            dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]+num[i][j]);
                            dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k-1]+num[i][j]);
                            dp[i][j][k]=max(dp[i][j][k],dp[i][j-1][k]+num[i][j]);
                        }
    
                    }
            printf("%d
    ",dp[n][m][n]);
        }
        return 0;
    }
     
  • 相关阅读:
    阻止所有普通账号登录服务器
    grep命令
    redis集群配置和节点管理
    redis的安装和配置
    shell特殊字符
    获取docker容器的ip地址
    mysql5.6.38误删除root用户后的一系列问题及解决办法
    CenrOS7.5安装msyql5.7.24
    使用163邮箱的smtp ssl端口发送邮件
    linux统计大文件行数的命令效率大对比
  • 原文地址:https://www.cnblogs.com/mgz-/p/6792781.html
Copyright © 2020-2023  润新知