HDU To the Max
阿新 • • 發佈:2021-01-13
前言
明明以前做過卻忘了的感覺真的超級難受,最後還是受了別人的程式碼啟發才寫出來。
一、分析
這個題是要求求最大子矩陣和,不難看出這題肯定和動態規劃掛鉤了,但直接二維的話肯定很難。所以這裡可以先將二維壓縮成一維來做(居然還能這樣),我們可以按行列舉,將矩陣每一列求和,存到另一個一維陣列,這樣問題就變成了求最大連續欄位和了,這時就是一個非常簡單的問題了。
二、程式碼
程式碼如下(示例):
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int maxn=105;
int MAX=-99999999;
int a[maxn][maxn],b[maxn];
int main()
{
int n,sum,k,i,j;
while(scanf("%d",&n)==1){
if(n==0) break;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);//輸入二維陣列
}
}
for(i=0;i<n;i++)//從0~n-1行開始
{
memset(b,0,sizeof(b));//每次列舉後將b陣列清0
for(j=i;j<n;j++)//從第i行~第n-1行列舉
{
for(k=0;k<n;k++)
{
b[k]+=a[j][k];//將j行到k行的每一列都加起來,將二維陣列轉換成一維,問題也就轉變成了求最大連續欄位和
}
sum=0;
//求最大連續欄位和
for(k=0;k<n;k++)
{
if(sum+b[k]>0) sum+=b[k];
else sum=0;
if(sum>MAX) MAX=sum;
}
}
}
printf("%d\n",MAX);
}
return 0;
}
總結
程式碼肯定是可以再優化的,能力不夠完全想不出啊啊啊啊。