【发布时间】:2017-05-03 00:53:30
【问题描述】:
我很难想出一种方法来解决动态编程问题。基本上,我必须从 NxN 数组中的左上角到右下角的元素,只能向下或向右移动,但我应该移动到更大的元素并将其汇总到一个变量中(通过仅向右移动获得最高分和向下)。 F.e.,如果我有这个矩阵:
0 1 1
0 4 2
1 1 1
它应该移动 0-> 1 -> 4 -> 2 -> 1 并打印出 8。 我已经阅读了很长时间的动态优化,但仍然无法解决这个问题。如果有人可以帮助我,将不胜感激。 提前致谢!
编辑:谢谢@sestus!我已经设法解决了这个问题,但是解决方案很慢,我必须对其进行优化以更快地执行。这是我的解决方案:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 100;
int arr[MAX][MAX];
int move(int row,int col, int n)
{
if(row >= n || col >= n)
{
return 0;
}
return max(arr[row][col] + move(row + 1, col, n),
arr[row][col] + move(row, col + 1, n));
}
int main()
{
int examples, result;
cin>>examples;
int n;
int results[examples];
for(int k =1; k <= examples; k++)
{
cin >> n;
int s = 0;
int i = 0, j = 0;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
cin>> arr[i][j];
}
}
i = 0, j = 0;
s+=move(i,j, n);
results[k] = s;
}
for(int k = 1; k <= examples; k++)
{
cout<<results[k]<<endl;
}
return 0;
}
(程序实际上必须获取所有示例并在最后输出所有示例的答案)。介意帮我优化吗?
【问题讨论】: