#include <algorithm> #include <bits/stdc++.h> #include <climits> #include <vector> using namespace std; //求一维数组的最大连续子数列的值 int getOneDimFunc(int arr[],int n){ int dp[n]; dp[0] = arr[0]; for(int i =1;i<n;i++){ dp[i] = max(arr[i],arr[i]+dp[i-1]); } int max = INT_MIN; for(auto a:dp){ if(a>max)max = a; } return max; } int main() { int n; while(cin>>n){ int arr[n][n];//声明一个矩阵 for(int i =0;i<n;i++) for(int j =0;j<n;j++) cin>>arr[i][j]; //取dp vector<int>dp; for(int i =0;i<n;i++){ for(int j =i;j<n;j++){ //i,j均表示行号 if(i == j){ //在一行内 //直接把该行传入 dp.push_back(getOneDimFunc(arr[i],n)); }else{ //不在同一行内,把两个行之间的所有元素作一维化(压缩,不是拉长) vector<int>temp; //按列遍历 for(int x=0;x<n;x++){ int tt=0; for(int k=i;k<=j;k++){ tt+=arr[k][x]; } temp.push_back(tt); } //传参 dp.push_back(getOneDimFunc(&temp[0],temp.size())); } } } //输出v中最大值 cout<<*max_element(dp.begin(),dp.end()); } } // 64 位输出请用 printf("%lld")
思路来源:BV1cw411f7Rf
本来仿着王道的思路写的,结果自测一直出11...debug找不出原因就换思路了