杭电ACM1081——To The Max

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

杭电ACM1081——To The Max的相关文章

杭电 HDU ACM 1003 Max Sum

 Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 164592    Accepted Submission(s): 38540 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the ma

杭电 1003 Max Sum

http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 142781    Accepted Submission(s): 33242 Problem Description Given a sequence a[1],a[2],a[3

杭电1003(Max Sum) 首次dp

点击打开杭电1003 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14. Input The first line of the inp

杭电1024(Max Sum Plus Plus)

点击打开杭电1024 Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem. Given a consecutive

杭电ACM3415——Max Sum of Max-K-sub-sequence

一开始,看到这题,以为是最大连续子序列和的问题,写出了代码,提交了,WR,找了一些测试数据,结果发现这个算法并不能将所以的序列的解求出,只是满足一部分序列. 百度了一下,知道了要用单调队列来求解. 单调队列,也就是队列中必然是单调递减的或者递增的.而这题使用的是单调递增的队列. 单调队列使用的是双向队列,队尾队头都可以删除元素,只能从队尾插入元素. 比如求解一个数列{1  ,2  ,5 ,3, 4, 6}的最长的递增序列的长度. 首先,1入队,队列中有 1. 接下来2比1 大,2入队,队列为 1

hdu 1016 Prime Ring Problem DFS解法 纪念我在杭电的第一百题

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29577    Accepted Submission(s): 13188 Problem Description A ring is compose of n circles as shown in diagram. Put natural num

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)

题目地址:HDU 4937 多校的题以后得重视起来...每道题都错好多次...很考察细节.比如这道....WA了无数次.... 这题的思路自己真心想不到...这题是将进制后的数分别是1位,2位,3位和更多位的分开来计算. 当是1位的时候,显然只有3到6,此时只能是-1 当是2位的时候,可以转换成一元一次方程求解 当是3位的时候,可以转换成一元二次方程求解 当是4位的时候,此时最多也只有7000个数,7000^3接近1e12.所以剩下的直接枚举进制数来判断即可. 代码如下: #include <i

杭电 1754 I Hate It(线段树求最值)

http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 38601    Accepted Submission(s): 15270 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某