NYOJ - 最大和(DP)
来源:互联网 发布:淘宝棉麻女装 编辑:程序博客网 时间:2024/05/16 07:47
最大和
时间限制:1000 ms | 内存限制:65535 KB
难度:5
- 描述
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:9 2
-4 1
-1 8
其元素总和为15。- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数; - 输出
- 输出矩阵的最大子矩阵的元素之和。
- 样例输入
14 40 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
- 样例输出
15
#include <stdio.h>#include <string.h> int ans[101][101];int dp[101];int max_sum(int n){int i,s = 0,max = dp[0];for(i = 0; i < n; i++){if(s > 0)s += dp[i];elses = dp[i];if(s > max)max = s;}return max;}int main(void){int n,r,c,i,j,k,max,s;scanf("%d",&n);while(n--){scanf("%d%d",&r,&c);for(i = 0; i < r; i++){for(j = 0; j < c; j++){scanf("%d",&ans[i][j]);}}max = -100000000;for(i = 0; i < r; i++){memset(dp,0,sizeof(dp));for(j = i; j < r; j++){for(k = 0; k < c; k++){dp[k] += ans[j][k];}s = max_sum(k);if(max < s)max = s;}}printf("%d\n",max);}return 0;}
这个也是经典的DP问题,因为,这个题目可以转化为求出一组序列的连续子串最大和问题,如何求出矩阵中最大和子矩阵,我们这里可以将二维的矩阵压缩成一维,当矩阵被压缩成一维之后,那么,这个问题就转化为连续子串最大和问题,所以,这个问题也就解决了。这题已经AC,这里提供参考。
- NYOJ - 最大和(DP)
- NYOJ - 104 最大和【DP】
- nyoj 104 最大和 【dp】
- 最大和 NYOJ 简单三维DP
- NYOJ 104 最大和(DP)
- nyoj 104 最大和 【区间dp】
- NYOJ-104-最大和(DP)
- NYOJ+dp最大字串和+注意初始化赋值那,
- nyoj 104 最大和 【压缩矩阵 DP求最大连续子序列的和】
- nyoj 104 最大和 51nod oj 1051 最大子矩阵和 【DP】
- nyoj 104 最大和
- NYOJ 104 最大和
- NYOJ-104 最大和
- nyoj 104 最大和
- NYOJ 104 最大和
- nyoj 102 最大和
- NYOJ 104 最大和
- nyoj 104 最大和
- 尽量在不得已的情况下才使用设计模式
- linux c 模拟闹钟程序
- JavaBean保存范围
- Waiting for HOME (‘android.process.acore’) to be launched…解决办法
- Fuck MediaWiki (3) 用户权限管理
- NYOJ - 最大和(DP)
- IIS配置
- 汉诺塔问题
- 搜索引擎优化(其一)
- BFS+诡异的楼梯
- android取消EditText的焦点
- 工厂模式
- PHP根据浏览器跳转不同语言页面代码
- android 开机动画(boot animation)的制作