UVa 108|Maximum Sum|动态规划
来源:互联网 发布:windows水印在哪里 编辑:程序博客网 时间:2024/05/17 08:45
原题地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=44
题目翻译
通常一个在一维上很好解决的问题扩展到二维后就难解决多了。类似的还有2-SAT和3-SAT(NPC问题)。
给定一个二维数组,找出一个子矩阵最大化其个元素的和。
比如数组:
0 -2 -7 0 9 2 -6 2-4 1 -4 1-1 8 0 -2
最左下角的一个子矩阵:
9 2-4 1-1 8
的和15最大。
输入
第一行一个整数
接下来
输出
一行一个整数,表示子矩阵的最大和。
样例输入
40 -2 -7 0 9 2 -6 2-4 1 -4 1 -18 0 -2
样例输出
15
题解
题目给了很明显的暗示。
我们考虑一维问题,给定一个数列,求最大子串和。对于已经求出的前缀和
扩展到二维的话,我们考虑枚举一维,另一维仍按照上面的做法做。
#include <cstdio>#define FOR(i,j,k) for(i=j;i<=k;++i)const int N = 105;int mat[N][N], sum[N][N];int main() { int n, i, j, k; scanf("%d", &n); FOR(i,1,n) FOR(j,1,n) { scanf("%d", &mat[i][j]); sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + mat[i][j]; } int ans = 0x80000000; FOR(i,1,n) FOR(j,1,i) { // j~i int mi = 0; FOR(k,1,n) { int t = sum[i][k] - sum[j - 1][k] - mi; if (t > ans) ans = t; if (sum[i][k] - sum[j - 1][k] < mi) mi = sum[i][k] - sum[j - 1][k]; } } printf("%d\n", ans); return 0;}
阅读全文
0 0
- UVa 108|Maximum Sum|动态规划
- Maximum sum-动态规划
- 动态规划--Maximum sum
- [动态规划]UVA108 - Maximum Sum
- UVa 108 - Maximum Sum
- UVa 108 - Maximum Sum
- uva 108 - Maximum Sum
- UVa 108 - Maximum Sum
- UVa 108 - Maximum Sum
- UVa:108 Maximum Sum
- UVa 108: Maximum Sum
- UVA - 108 Maximum Sum
- UVA 108 Maximum Sum
- uva 108 Maximum Sum
- UVa 108 - Maximum Sum
- UVA 108 Maximum Sum
- UVA - 108 Maximum Sum
- uva 108 Maximum Sum
- 通过cglib实现动态代理
- MIT18.06线性代数课程笔记1:矩阵和向量相乘的三种解释
- redis 五种数据类型的使用场景
- 从删服务器到恢复
- PIVOT 行列相转
- UVa 108|Maximum Sum|动态规划
- linux -unrar解压缩
- MySQL数据类型
- 1023. 组个最小数 (20)
- SpringCloud(第 024 篇)简单文件上传微服务,并加入 zuul 微服务后用 zuul 微服务地址采取curl或者页面点击实现文件上传
- c#中手动及半自动编译wsdl并调用
- Qt多版本共存的QTDIR设置有关问题
- 【OpenGL】使用DDA算法画线
- POJ 2774 Long Long Message(后缀数组)