poj 1050_To the max(需要轉換思維,求一個欄位和最大問題)
阿新 • • 發佈:2018-12-11
分析: 對於此題,首先可以想到的有字首和,這個題的關鍵也是字首和,但是怎麼設計這個字首和是一個好問題。
通常我們所用的字首和大多都是在一維陣列上,可以通過一維陣列中的字首和來求得在一維陣列上求一個欄位,且使欄位的和最大這個問題。推廣到二維陣列,二維陣列中記錄的是所在列的字首和(一定要參照程式碼理解)。然後通過和一維陣列求最大和欄位類似的方法,延伸到二維陣列(從列上可以直觀的看出)。
#include <iostream> #include <cstring> using namespace std; #define inf 0x3f3f3f3f int res[105][105]; //res陣列中記錄的是列上的字首和 用的非常好,很值得學習 int main() { memset(res,0,sizeof res); int n;cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int t;cin>>t; res[i][j]=res[i-1][j]+t; //仔細看實現過程 很重要 } } int sum=0,maxa=-inf; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { sum=0; for(int k=1;k<=n;k++) { sum+=res[j][k]-res[i-1][k]; if(sum<0) sum=0; maxa=max(sum,maxa); } } } cout<<maxa<<endl; return 0; }