ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【解题报告】洛谷P1719 最大加权矩形

2021-10-11 20:31:57  阅读:172  来源: 互联网

标签:加权 include 洛谷 前缀 int 矩形 解题 P1719


【解题报告】洛谷P1719 最大加权矩形

题目链接

https://www.luogu.com.cn/problem/P1719

思路

我们可以看出来,如果这个一维的话,实际上就是一个最大字段和的问题,所以我们还是两个思路,贪心和动态规划,只不过从加一个数字变成了加一列或者加一行

我们可以用二位前缀和来算一行或者一列的东西吧

  1. 贪心

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    int n;
    int ans,a[125][125];
    int main()
    {
    	std::ios::sync_with_stdio(false);
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			cin>>a[i][j];
    			a[i][j]+=a[i-1][j];
    		}
    	}
    	for(int i=1;i<=n;i++)
    	{
    		for(int k=1;k<=i;k++)
    		{
    			int b[150]={0};
    			int f[150]={0};
    			for(int j=1;j<=n;j++)
    			{
    				b[j]=a[i][j]-a[i-k][j];
    				f[j]=max(f[j-1]+b[j],b[j]);
    				ans=max(ans,f[j]);
    			}
    		}
    	}
    	cout<<ans<<'\n';
    	return 0;
    }
    
  2. 动态规划

    这里介绍一下动态规划的思路

    设 \(f[i][j]\) 表示从 \((1,1)\) 到 \((i,j)\) 这个矩形之内的最大加权矩形,我们就有

    \[f[i][j]=max(f[i-1][j]+line[i],f[i][j-1]+row[j],f[i-1][j-1]) \]

    其中 \(s[i][j]\) 表示二位前缀和, \(row,line\) 分别可以通过二维前缀和算出来

代码的话?没有代码

标签:加权,include,洛谷,前缀,int,矩形,解题,P1719
来源: https://www.cnblogs.com/wweiyi2004/p/15394869.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有