51nod矩阵取数问题V2

来源:互联网 发布:ping mac 获取ip地址 编辑:程序博客网 时间:2024/06/03 11:57

基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上。第1遍时只能向下和向右走,第2遍时只能向上和向左走。两次如果经过同一个格子,则该格子的奖励只计算一次,求能够获得的最大价值。
 
例如:3 * 3的方格。

1 3 3
2 1 3
2 2 1

能够获得的最大价值为:17。1 -> 3 -> 3 -> 3 -> 1 -> 2 -> 2 -> 2 -> 1。其中起点和终点的奖励只计算1次。
Input
第1行:2个数M N,中间用空格分隔,为矩阵的大小。(2 <= M, N <= 200)第2 - N + 1行:每行M个数,中间用空格隔开,对应格子中奖励的价值。(1 <= A[i,j] <= 10000)
Output
输出能够获得的最大价值。
Input示例
3 31 3 32 1 32 2 1
Output示例
17

代码如下:

#include <bits/stdc++.h>#define maxn 205using namespace std;int d[maxn][maxn][maxn] = {0}, a[maxn][maxn];int main(){int n, m;scanf( "%d%d", &m, &n);for ( int i = 1; i <= n; i++){for ( int j = 1; j <= m; j++){scanf( "%d", &a[i][j]);}}for ( int i = 1; i <= n; i++){for ( int j = 1; j <= n; j++){for ( int k = 1; k <= m; k++){d[i][k][j] = max( d[i - 1][k][j], max( d[i - 1][k][j - 1], max( d[i][k -1][j], d[i][k - 1][j - 1])));if ( i == j){d[i][k][j] += a[i][k];}elsed[i][k][j] += a[i][k] + a[j][i + k - j];}}}printf( "%d\n", d[n][m][n]);return 0;}





0 0
原创粉丝点击