poj1050 To the Max (動態規劃)
阿新 • • 發佈:2019-01-09
題目意思:
給出一個矩陣。求出和最大的子矩陣,在解決這個問題的之前,首先看一下這個問題的一維問題,給出一個序列求最大子序列。滿足i<=i<=j<=n 求出最大的i-->j的和。
題目分析:
對於一維問題,有很多的解決方法,當然也對應不同的時間和空間複雜度。有暴力,優化暴力,貪心,動態規劃等解法,由於這裡此題的二維問題要用到動態規劃,這裡只給出動態規劃演算法。對於二維問題只需要轉化為一維的問題,在用動態規劃方法解決問題。
一維動歸:
int ToMax(int a[],int n){ int s[10000]={0}; for(int i=1;i<=n;i++){ if(s[i-1]>=0) s[i]=s[i-1]+a[i]; else s[i]=a[i]; } int ma=-10000000; for(int i=1;i<=n;i++){ if(s[i]<ma) ma=s[i]; } return ma; }
二維AC程式碼:
#include<iostream> #include<cstring> using namespace std; int a[105][105],sum[105],b[105]; int main() { int n; while(cin>>n){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; } } memset(sum,0,sizeof(sum)); int max=-100000; for(int i=1;i<=n;i++){ memset(sum,0,sizeof(sum)); memset(b,0,sizeof(b)); for(int k=i;k<=n;k++){ for(int j=1;j<=n;j++){ b[j]+=a[k][j]; if(sum[j-1]>=0){ sum[j]=sum[j-1]+b[j]; } else sum[j]=b[j]; if(max<sum[j]) max=sum[j]; } } } cout<<max<<endl; } return 0; }