2 秒131,072 kb
20 分
3 級題
乙個m*n的矩陣,找到此矩陣的乙個子矩陣,並且這個子矩陣的元素的和是最大的,輸出這個最大的值。
例如:3*3的矩陣:
-1 3 -1
2 -1 3
-3 1 2
和最大的子矩陣是:
3 -1
-1 3
1 2收起
第1行:m和n,中間用空格隔開(2 <= m,n <= 500)。第2 - n + 1行:矩陣中的元素,每行m個數,中間用空格隔開。(-10^9 <= m[i] <= 10^9)
輸出和的最大值。如果所有數都是負數,就輸出0。
3 3-1 3 -1
2 -1 3
-3 1 2
7題解:簡單dp,會求一維的最大子段和就行
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps (1e-8)
#define max 0x3f3f3f3f
#define u_max 1844674407370955161
#define l_max 9223372036854775807
#define i_max 2147483647
#define re register
#define pushup() tree[rt]=tree[rt<<1]+tree[rt<<1|1]
#define nth(k,n) nth_element(a,a+k,a+n); // 將 第k大的放在k位
#define ko() for(int i=2;i<=n;i++) s=(s+k)%i // 約瑟夫
#define ok() v.erase(unique(v.begin(),v.end()),v.end()) // 排序,離散化
#define catalan c(2n,n)-c(2n,n-1) (1,2,5,14,42,132,429...) // 卡特蘭數
using namespace std;
inline int read()
while(c >= '0' & c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}typedef long long ll;
const double pi = atan(1.)*4.;
const int inf = 0x3f3f3f3f;
const ll inf = 0x3f3f3f3f3f3f3f3fll;
const int m=63;
const int n=1e5+5;
ll mod=1e9+7;
int n,m,p=0,x,y; // x 和 y 分別記錄從幾行到幾行,比如題中是 1 行到 3 行
ll a[505][505],dp[250050];
ll fun()
if(sum<0)
}return ans;
}ll sum[505][505];
int main()
ll ans=-mod; int x1=0,y1=0,x2=0,y2=0;
for(int i=1;i<=m;i++)}}
if(!leap) printf("0\n");
else printf("%lld\n",ans);
return 0;
}
1051 最大子矩陣和
1051 最大子矩陣和 基準時間限制 2 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個m n的矩陣,找到此矩陣的乙個子矩陣,並且這個子矩陣的元素的和是最大的,輸出這個最大的值。例如 3 3的矩陣 1 3 1 2 1 3 3 1 2 和最大的子矩陣是 3 1 1 3 1 2i...
51nod 1051 最大子矩陣和 dp
題意 乙個m n的矩陣,找到此矩陣的乙個子矩陣,並且這個子矩陣的元素的和是最大的,輸出這個最大的值。例如 3 3的矩陣 1 3 1 2 1 3 3 1 2 和最大的子矩陣是 3 1 1 3 1 2分析 三重迴圈,類似於求解一維中的最大連續和一樣的dp問題,只不過換成了二維而已。include inc...
51nod 1051 最大子矩陣和 dp
1051 最大子矩陣和 基準時間限制 2 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個m n的矩陣,找到此矩陣的乙個子矩陣,並且這個子矩陣的元素的和是最大的,輸出這個最大的值。例如 3 3的矩陣 1 3 1 2 1 3 3 1 2 和最大的子矩陣是 3 1 1 3 1 2 ...