码迷,mamicode.com
首页 > 其他好文 > 详细

杭电ACM1081——To The Max

时间:2015-04-23 21:44:53      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:acm   杭电   

  开始看到这题的时候,一点头绪都没有,本来想用暴力解决的,可是看到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;
}

杭电ACM1081——To The Max

标签:acm   杭电   

原文地址:http://blog.csdn.net/qq_25425023/article/details/45227437

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!