您的位置:首页 > 编程语言 > C语言/C++

数字矩阵-双向动态规划入门

2017-01-10 19:26 204 查看


数字矩阵

Time Limit: 1000MS
Memory Limit: 65536KB
Submit

Statistic

Problem Description

bLue 站在了一个 n*m 的填有数字的矩阵中,他可以选择从矩阵的四个顶点之一出发,到达斜对面的顶点。每一步必须向靠近目的地的方向移动,且每次移动都可以累加所在位置上的数字。

例如,bLue 选择从左上角出发,那么目的地为右下角,则他每次只能向右或向下移动一格。

现在他想知道在所有的走法中,能获得的最大累加和是多少。你能帮助他吗?

Input

输入数据有多组(数据组数不超过 50),到 EOF 结束。

对于每组数据:

第 1 行输入 2 个整数 n, m (1 <= n, m <= 100),表示矩阵的行数和列数。
接下来 n 行,每行包含 m 个用空格隔开的整数 aij (0 <= aij <= 10000),表示这个数字矩阵。

Output

对于每组数据,输出 1 行,包含 1 个整数,表示 bLue 能获得的最大的累加和。

Example Input

3 4
1 2 3 4
1 0 6 5
4 7 2 0


Example Output

28


Hint

Author

bLue

#include<stdio.h>
#include<string.h>
#include<math.h>
int a[101][101],b[101][101];
int main()
{
int m,n;
while(~scanf("%d%d",&n,&m))

{

for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
b[i][j] = a[i][j];

}

}

for(int i=2;i<=m;i++)
{
a[1][i] += a[1][i-1];
}

for(int i=2;i<=n;i++)
{
a[i][1] += a[i-1][1];
for(int k=2;k<=m;k++)
{

if(a[i-1][k]>a[i][k-1])
{
a[i][k] += a[i-1][k];
}
else

{
a[i][k]  += a[i][k-1];
}

}
}

for(int i=2;i<=m;i++)
{
b
[i] += b
[i-1];
}

for(int i=n-1;i>=1;i--)

{
b[i][1]+=b[i+1][1];
for(int k=2;k<=m;k++)
{

if(b[i][k-1]>b[i+1][k])
{
b[i][k] += b[i][k-1];

}

else

{
b[i][k] += b[i+1][k];
}
}

}

printf("%d\n",b[1][m]>a
[m]?b[1][m]:a
[m])     ;

}

return 0;

}

/***************************************************
User name: jk160505徐红博
Result: Accepted
Take time: 12ms
Take Memory: 192KB
Submit time: 2017-01-10 15:46:40
****************************************************/


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息