1032.机器人
Description
为了运算的简单,我们将SYC的屋子看做N*M的矩阵,在矩阵的每一个坐标上都可能有不同数量的垃圾。已知开始时这两个机器人都放在矩阵的左上角,两个机器人每次都只能向右或向下走一步,而且不能向回走,也不能走另一个机器人走过的坐标。现在请你帮忙,计算这两个机器人都走到右下角时打扫垃圾的最大数量。
Input
接下来有N行,每行有M个数据,表示N*M的矩阵,每行各个数字使用空格分隔。矩阵第i行j列的数字表示该处垃圾的个数(不超过1000)。
Output
Sample Input
3 3 0 9 9 6 1 8 2 3 0
Sample Output
37
思路 : 其实没那么难啦 嘻嘻 虽然当初也不会 看完后会秒懂的 HHHHHH!!
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
int dp[55][55][55][55];两个机器人的坐标
int maxx( int x ,int y )
{
if( x > y )
return x;
else
return y;
}
int main()
{
int n, m;
int i , j, k, l;
scanf("%d%d", &n, &m);
int a[55][55];
for( i =1; i<=n; i++)
{
for( j =1; j<=m; j++)
scanf("%d", &a[i][j] );
}
for( i =1; i<=n; i++)
{
for( j =1; j<=m; j++)
{
for( k =1; k<i; k++)
{
l = i + j - k;
dp[i][j][k][l] = maxx( maxx( dp[i-1][j][k-1][l], dp[i-1][j][k][l-1]), maxx( dp[i][j-1][k-1][l], dp[i][j-1][k][l-1])) + a[k][l] + a[i][j];
}
}
}
printf("%d\n", dp[n][m-1][n-1][m]);
}