杭电ACM1081——To The Max

来源:互联网 发布:淘宝网笔袋图片 编辑:程序博客网 时间:2024/05/02 00:20

  开始看到这题的时候,一点头绪都没有,本来想用暴力解决的,可是看到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));       //数组初始化为0if(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];elsedp[k] = temp[k - 1];if(dp[k] > max)                    //跟新最大值max = dp[k];}}}cout << max << endl;}return 0;}

0 0
原创粉丝点击