uva1366_Martian Mining_简单DP

 题目不难,却想了好长时间,目测自己DP还是很水。。。囧

 思路:舍f[i][j]为前i行j列的最大矿总量不难推出状态转移方程为f[i][j]=max(f[i-1][j]+line[i][j],f[i][j-1]+row[j][i])

 其中line[i][j]为第i行前j个A矿的和(a[i][1]+a[i][2]+...+a[i][j]),row[i][j]为第i列前j个B矿的和(b[i][1]+b[i][2]+...+b[i][j])

 result:

          

 代码如下:

#include <cstdio>
inline int max(int x,int y)
{
    return x>y?x:y;
}
int a[510][510],b[510][510],f[510][510],n,m,line[510][510],row[510][510];
int main()
{
    int i,j;
    while (scanf("%d%d",&n,&m) && (n || m))
    {
        for (i=1; i<=n; ++i)
            for (j=1; j<=m; ++j)
                scanf("%d",&a[i][j]);
        for (i=1; i<=n; ++i)
            for (j=1; j<=m; ++j)
                scanf("%d",&b[i][j]);
        for (i=1; i<=n; ++i)
            for (j=1; j<=m; ++j)
                line[i][j]=line[i][j-1]+a[i][j];
        for (i=1; i<=m; ++i)
            for (j=1; j<=n; ++j)
                row[i][j]=row[i][j-1]+b[j][i];
        for (i=1; i<=n; ++i)
            for (j=1; j<=m; ++j)
                f[i][j]=max(f[i-1][j]+line[i][j],f[i][j-1]+row[j][i]);
        printf("%d\n",f[n][m]);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Chierush/p/2993751.html