**
航电oj:To the Max
**
#题目描述
#给你一个n为边的正方形,要你找到这个正方形块中,矩形块数据中的数据和最大的数
怎么想都不可能是暴力法能够过得 用动态规划
用数组存上列的和 再每一列的拼接成块
#知识点
动态规化
#代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int data[101][101];
int moveplan[101];//动规 寄存有上次的数据
int n,tempsum,maxx;
int main()
{
scanf("%d",&n);
memset(data,0,sizeof(data));
maxx = -20000;
for(int i=1; i<=n; i++)
for(int k=1; k<=n;k++)
{
scanf("%d",&data[i][k]);
}
//
for(int i=1;i<=n;i++)//基线
{
memset(moveplan,0,sizeof(moveplan));//基线变了 有一部分数据被舍弃了 数组中的值要改变
for(int j=i;j<=n;j++)//待选的行
{
tempsum = 0;//矩形块的值
for(int k=1;k<=n;k++)//列
{
moveplan[k]+= data[j][k];//数组将每一列都存起来了(基线下的数据除外)
if(tempsum>0)//矩形中的值为负了就直接换一个,直到换到一个正的
{
tempsum += moveplan[k];//往矩形块上加列
}else{
tempsum = moveplan[k];//换一个块(用新的一列充当)
}
if(tempsum>maxx)//最大值会在这样一个过程中出现
{
maxx = tempsum;
}
}
}
}
printf("%d\n",maxx);
return 0;
}
#总结
动规要理解 套公式的不懂怎么弄的 思考 最大值总会在过程中出现 不要纠结于变化最后就值要最大