1. 程式人生 > 其它 >HDU To the Max

HDU To the Max

技術標籤:hduoj動態規劃動態規劃c語言c++

前言

明明以前做過卻忘了的感覺真的超級難受,最後還是受了別人的程式碼啟發才寫出來。

一、分析

這個題是要求求最大子矩陣和,不難看出這題肯定和動態規劃掛鉤了,但直接二維的話肯定很難。所以這裡可以先將二維壓縮成一維來做(居然還能這樣),我們可以按行列舉,將矩陣每一列求和,存到另一個一維陣列,這樣問題就變成了求最大連續欄位和了,這時就是一個非常簡單的問題了。

二、程式碼

程式碼如下(示例):

#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; }

總結

程式碼肯定是可以再優化的,能力不夠完全想不出啊啊啊啊。