51nod 1084 矩阵取数问题 V2(dp)

本文通过解决特定问题,探讨了多进程动态规划(DP)的实现与优化过程。作者最初尝试了基本的DP方法,但在面对复杂数据时遇到了瓶颈。通过调整算法结构,最终采用了一种更高效的三维DP解决方案,并分享了从失败中学习的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起初我是先dp了一遍,然后去除选择过的点,然后再dp一遍。就过了四个测试数据。这样果然有问题,可以写个数据试一下,这样走出来的不是最大的结果。去看讨论,有一个评论里面说这个叫多进程dp,涨知识了。
这里写图片描述
我先写了个四维数组的,超时。。。

#include <cstdio>
#include <cstring>

int G[100][100];
int dp[50][50][50][50];
int n,m;

int max(int a, int b)
{
    return a > b ? a:b;
}

int main()
{
    scanf("%d %d",&m,&n);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            scanf("%d",&G[i][j]);

    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
        {
            for(int p = 1; p <= n; ++p)
            {
                for(int q = 1; q <= m; ++q)
                {
        dp[i][j][p][q] = max(max(max(dp[i-1][j][p-1][q],dp[i-1][j][p][q-1]),dp[i][j-1][p-1][q]),dp[i][j-1][p][q-1]) + G[i][j] + G[p][q];
        if(i == p && j == q)
            dp[i][j][p][q] -= G[i][j];
                }
            }
        }
    }
    printf("%d\n",dp[n][m][n][m]);
    return 0;
}

然后写三维的,wa了几发就A了

#include <cstdio>
#include <cstring>

int G[201][201];
int dp[402][201][201];
int n,m;

int max(int a, int b)
{
    return a > b ? a:b;
}

int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%d %d",&m,&n);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            scanf("%d",&G[i][j]);

    for(int k = 1; k <= n+m; ++k)
    {
        for(int i = 1; i <= n && k-i >= 1; ++i)
        {
            for(int p = 1; p <= n && k-p >= 1; ++p)
            {
                dp[k][i][p] = max(max(max(dp[k-1][i-1][p],dp[k-1][i-1][p-1]),dp[k-1][i][p-1]),dp[k-1][i][p]) + G[i][k-i]+G[p][k-p];
                if(i == p)
                    dp[k][i][p] -= G[i][k-i];
            }
        }
    }
    printf("%d\n",dp[n+m][n][n]);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值