开始看到这题的时候,一点头绪都没有,本来想用暴力解决的,可是看到n可以到100,估计了下会超时,就放弃了,想过用动归做,但是没有想到如何去做。就暂且放下了。
今天再看到这题,百度了下,明白了如何去做了,就是将各行合并,再当作最大子序列来做,就很简单了。
n行,分别跟其他的行进行合并,然后动归计算最大值,不断的跟新最大值。
附上AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[105], temp[105]; int num[105][105]; int main() { int n, i, j; while(cin >> n) { for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { scanf("%d", &num[i][j]); } } int max = -10000000; for(i = 0; i < n; i++) // 从0到n-1,分别跟其他行合并来计算,包括自己这一行 { for(j = i; j < n; j++) { memset(temp, 0, sizeof(temp)); //数组初始化为0 if(i == j) { for(int k = 0; k < n; k++) //属于同一行。 temp[k] = num[i][k]; } else { for(int k = 0; k < n; k++) //不属于同一行,将i行到j行的值累加起来 { for(int l = i; l <= j; l++) temp[k] += num[l][k]; } } memset(dp, 0, sizeof(dp)); //递推数组初始化 for(int k = 1; k <= n; k++) //下面的是简单的动归,很简单的 { if(dp[k - 1] > 0) dp[k] = dp[k - 1] + temp[k - 1]; else dp[k] = temp[k - 1]; if(dp[k] > max) //跟新最大值 max = dp[k]; } } } cout << max << endl; } return 0; }
时间: 2024-10-12 05:22:37