hdu 1081 (dp_区间dp)
来源:互联网 发布:淘宝网的网址域名 编辑:程序博客网 时间:2024/05/17 03:06
Description
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
Input
The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].
Output
Output the sum of the maximal sub-rectangle.
Sample Input
40 -2 -7 0 9 2 -6 2-4 1 -4 1 -18 0 -2
Sample Output
15
这是一个动态规划问题,onedim[ ]表示将i 到 j 行的数字压缩到一行,然后就可以将问题转换到求最大子序列的和的问题,进一步求出问题的解,特别要注意数组的初始化问题,每次讲二维数组压缩到一维数组的时候,都要将数组初始化为0;然后进行压缩,每次压缩之后就可以取最大值,进而求出答案
代码:
#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<cstring>using namespace std;int arrsize;int arrnumber[105][105];int onedim[105];void trans(int srow ,int enrow )///将二维矩阵转化为一维的;然后求最大连续子序列的和{ memset(onedim,0,sizeof(onedim)); for ( int j = 0; j < arrsize; j++ ) { for ( int i = srow; i<= enrow; i++ ) { onedim[j] += arrnumber[i][j]; } }}int maxsum ()///求最大连续子序列的和{ int bigsum[105]; memset(bigsum,0,sizeof(bigsum)); bigsum[0] = onedim[0]; for ( int i = 1; i < arrsize; i++ ) { if ( bigsum[i-1] > 0) bigsum[i]=bigsum[i-1]+onedim[i]; else bigsum[i] = onedim[i]; } int ans = 0; for ( int i = 1; i < arrsize; i++ ) { ans = max(ans,bigsum[i]); } return ans;}int main(){ //freopen("in.txt","r",stdin); while ( cin >> arrsize ) { for ( int i = 0; i < arrsize; i++ ) { for ( int j = 0; j < arrsize; j++ ) { cin >> arrnumber[i][j]; } } int ans = 0; for ( int i = 0 ;i < arrsize; i++ ) { for ( int j = i; j < arrsize; j++ ) { trans(i,j); ans = max(ans,maxsum()); } } cout << ans << endl; }}
0 0
- hdu 1081 (dp_区间dp)
- 【DP_区间DP专辑】
- 动态规划专题:【DP_区间DP专辑】
- 动态规划练习题:【Hdu 4283】 You Are the One (DP_区间DP)
- [Hdu 1520] (DP_树形DP) 入门训练
- hdu 4283(区间dp)
- hdu 5639(区间dp)
- HDU 1227(区间dp)
- hdu 4283 (区间dp)
- hdu 5900(区间DP)
- HDU-4283(区间DP)
- HDU-2476(区间DP)
- hdu 4283(区间dp)
- 【DP_树形DP专辑】
- DP_状态压缩DP
- 【DP_树形DP专辑】
- 【DP_树形DP专辑】
- HDU 4753 Two Rabbits(区间DP)
- java调用淘宝API实例
- mac 系统开发android 真机调试找不到设备的问题
- [Openstack-keystone] Expecting an auth URL via either --os-auth-url or env[OS_AUTH_URL]
- 从QWebView类中下载图片
- 手势和UI控件之间冲突的解决方法(比如UITapGesture和UIButton冲突,UIPanGesture和UISlider冲突)
- hdu 1081 (dp_区间dp)
- 程序员如何像写代码一样找女朋友
- POJ-2421 最小生成树 算法复习计划
- 使用fedora 20
- Apache2.4.3编译移植
- POJ1144-Network(割顶模板题)
- hdu-4857-逃生-拓扑排序
- wifi详解(二)
- Linux rpm 命令参数使用详解[介绍和应用]