动态规划的问题,对于一维的问题是很简单的,对于二维的问题只需把它变成一维就行了; #include <iostream> using namespace std; int Rectangle[100][100]; int DpRectangle[100]; int Single_Rectangle[100]; int Max = 0; int main() { int N; //输入矩形数组 cin>>N; for( int i = 0; i < N ; ++i){ for(int j = 0;j < N; ++j ) { cin>>Rectangle[i][j]; } } //动态规划过程N^3的时间复杂度 for(int i = 0; i < N; ++i) for(int j = 0; j < N; ++j) { //初始化一维记录数组为零 for( int k = 0; k < N; ++k ) Single_Rectangle[k] = 0; //把i到j行的数组压缩为一维记录数组 for( int k = 0; k < N; ++k ){ for(int z = i; z <= j; ++z) Single_Rectangle[k] += Rectangle[z][k]; } //初始化动态数组为零 for( int k = 0; k < N; ++k ) DpRectangle[k] = 0; //动态规划计算Single_Rectangle上的任意连续数的最大值 for(int k = 0; k < N; ++k) { if( k == 0 ) { DpRectangle[k] = Single_Rectangle[k]; } else { DpRectangle[k] = ( DpRectangle[k-1] > 0 ? DpRectangle[k-1]: 0 ) + Single_Rectangle[k]; } Max = Max > DpRectangle[k] ? Max : DpRectangle[k]; } } cout<<Max<<endl; return 0; }