POJ1050

1 篇文章 0 订阅

POJ1050

题目链接:http://poj.org/problem?id=1050

题目描述:
题目描述
首先求矩形区域和显然是使用前缀和。然后要求出最大区域和,则应想到动态规划。
先使用dp[r,c,w,h]表示以(r,c)为矩形右下角顶点时形状为(w,h)的矩形区域和,但这样时间空间复杂度过高,必须简化。
现在使用dp[c,w],更新顺序为r从1到n,c从1到n,w从1到c(或从c到1),dp[c,w]表示当前行r下,以(r,c)为矩形右下角顶点时,矩形占用w列时,区域和的最大值。这样时间复杂度为O(N3),空间复杂度为O(N2),是可行的。
更新法则为

int dp_row=sum[r][c]-sum[r][c-l]-sum[r-1][c]+sum[r-1][c-l];
dp[c][l]=max(dp_row,dp[c][l]+dp_row);

代码

#include <iostream>
#include <algorithm>
#define N 102
using namespace std;

int main()
{
    int n;
    int sum[N][N]={0};
    //dp[C][L]
    //以当前行C列处为矩形右下角顶点,占用L列时,矩形区最大和
    int dp[N][N]={0};
    cin>>n;
    //矩形区域和-->二维前缀和
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>sum[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
    //初始化
    int max_val=-n*n*128;
    for(int c=1;c<=n;c++)
        for(int l=1;l<=c;l++)
            dp[c][l]=sum[1][c]-sum[1][c-l];
    //第一行已经初始化了,从第二行开始
    //从上到下,从左到右,从1到c遍历l,扫描
    for(int r=2;r<=n;r++)
        for(int c=1;c<=n;c++)
            for(int l=1;l<=c;l++)
            {
                int dp_row=sum[r][c]-sum[r][c-l]-sum[r-1][c]+sum[r-1][c-l];
                dp[c][l]=max(dp_row,dp[c][l]+dp_row);
                max_val=max(max_val,dp[c][l]);
            }
    cout<<max_val<<endl;
}

转载:https://blog.csdn.net/qq_36393962/article/details/82846432

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值