1. 程式人生 > 其它 >【解題報告】洛谷P1719 最大加權矩形

【解題報告】洛谷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\) 分別可以通過二維字首和算出來

程式碼的話?沒有程式碼

本博文為wweiyi原創,若想轉載請聯絡作者,qq:2844938982