国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

藍橋杯 歷屆試題 最大子陣

2019-11-09 19:52:30
字體:
來源:轉載
供稿:網友

歷屆試題 最大子陣 時間限制:1.0s 內存限制:256.0MB 提交此題 問題描述   給定一個n*m的矩陣A,求A中的一個非空子矩陣,使這個子矩陣中的元素和最大。

  其中,A的子矩陣指在A中行和列均連續的一塊。 輸入格式   輸入的第一行包含兩個整數n, m,分別表示矩陣A的行數和列數。   接下來n行,每行m個整數,表示矩陣A。 輸出格式   輸出一行,包含一個整數,表示A中最大的子矩陣中的元素和。 樣例輸入 3 3 -1 -4 3 3 4 -1 -5 -2 8 樣例輸出 10 樣例說明   取最后一列,和為10。 數據規模和約定   對于50%的數據,1<=n, m<=50;   對于100%的數據,1<=n, m<=500,A中每個元素的絕對值不超過5000。

最大子矩陣的做法是將矩陣變化, 就是把最大子矩陣變成最大連續子序列和,把二維變成一維。 如下圖 獎每豎行的和記錄,形成一個新的矩陣, 這樣只需要枚舉所有的i,j,求i到j的連續和最大的數。 最后找到的就是一個矩陣

3 3-1 -4 33 4 -1-5 -2 8-1 -4 32 0 2-3 -2 10#include <iostream>#include <string>#include <cstring>#include <stdio.h>#include <cmath>using namespace std;long long d[600][600],p[600][600];int main(){ int n,m; while(cin>>n>>m) { int i,j; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>d[i][j]; } }//cout<<endl; for(j=1;j<=m;j++) { long long x=0; for(i=1;i<=n;i++) { x+=d[i][j]; p[i][j]=x; } } /* for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cout<<p[i][j]<<' '; } cout<<endl; } */ int maxsum=-10000000; int x,y,z; for(i=1;i<=n;i++) { for(j=i;j<=n;j++) { int thissum=0; for(int k=1;k<=m;k++) { thissum+=p[j][k]-p[i-1][k]; if(thissum>maxsum) { x=i;y=j;z=k; maxsum=thissum; } if(thissum<0) thissum=0; } } } // cout<<x<< ' '<<y<<' '<<z<<endl; cout<<maxsum<<endl; }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄢陵县| 乐业县| 宁陵县| 莱州市| 张家界市| 高唐县| 平谷区| 买车| 安丘市| 六盘水市| 木兰县| 安乡县| 潼关县| 六枝特区| 莱芜市| 扎兰屯市| 平顺县| 自贡市| 江华| 通化县| 大英县| 永昌县| 肥乡县| 陵水| 五家渠市| 林甸县| 兴海县| 湘西| 德庆县| 安阳市| 沭阳县| 密山市| 张掖市| 通海县| 顺平县| 许昌市| 宿松县| 阳信县| 大同市| 石台县| 西畴县|