【解題報告】洛谷P1719 最大加權矩形
阿新 • • 發佈:2021-10-11
【解題報告】洛谷P1719 最大加權矩形
題目連結
https://www.luogu.com.cn/problem/P1719
思路
我們可以看出來,如果這個一維的話,實際上就是一個最大欄位和的問題,所以我們還是兩個思路,貪心和動態規劃,只不過從加一個數字變成了加一列或者加一行
我們可以用二位字首和來算一行或者一列的東西吧
-
貪心
#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; }
-
動態規劃
這裡介紹一下動態規劃的思路
設 \(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