我們得到一個N * N網格。我們最初在網格的左上角。網格中的每一個方格都有一定的價值,也就是說,如果有人到達那個廣場,他會贏得等於附加在廣場上的價值的美元。現在合法的舉動向右邁出了一步,或朝着底部邁出了一步。我們必須以一種方式到達電網的右下角,以便我們能夠最大限度地贏得金錢。顯然我們必須留在電網內,不能漫步。 我以一種貪婪的方法開始了這個問題,在每一步我們都看到佔用方塊下面的直接右方和直接方塊,並且在每一步選擇具有較高值的方塊。但是這並不總是給出正確的結果。例如,在下面的網格,如何最大化路徑的價值?
{ 6, 9, 18, 1 }
{ 2, 10, 0, 2 }
{ 1, 100, 1, 1 }
{ 1, 1, 1, 1 }
這裏我的算法給出了最大值路徑爲
6 -> 9 -> 18 -> 1 -> 2 -> 1 -> 1
這總計37,但我們可以贏得更多的道路上
6 -> 9 -> 10 -> 100 -> 1 -> 1 -> 1
其中總計爲128.你能幫助我建立一個合適的算法嗎?我還沒有編碼這個,因爲它會給出錯誤的輸出。我不知道如何在沒有暴力的情況下處理這個問題,這種暴力包括在所有不包含具有最小值的平方的路徑中看到值,然後找到最大值。
#include <iostream>
#include <queue>
using namespace std;
int main()
{ int n; cin >> n;
int a[n+1][n+1], b[n+1][n+1];
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
cin >> a[i][j]; b[i][j]=a[i][j];
}
}
queue <int> q; int u,v,m=0;
q.push(0);q.push(0);
while (q.size()!=0)
{
u=q.front(); q.pop(); v=q.front(); q.pop();
if (v<n-1)
{
m=b[u][v]+a[u][v+1];
if (m>b[u][v+1])
{ b[u][v+1]=m; }
q.push(u);q.push(v+1);
}
if (u<n-1)
{
m=b[u][v]+a[u+1][v];
if (m>b[u+1][v])
{ b[u+1][v]=m; }
q.push(u+1);q.push(v);
}
}
cout << b[n-1][n-1];
return 0;
}
這是一個可以通過[動態編程](https://en.wikipedia.org/wiki/Dynamic_programming)解決的經典問題。請告訴我們您在代碼中迄今取得的成就。 – miensol
@miensol請注意,原始的海報並沒有使用術語「動態編程」,我認爲他或她對這個概念不熟悉,因此暗示它可以通過動態編程來解決(本身是正確的,完全的有效)不是從問題的角度來解決問題。 – Codor
@Codor你當然是對的,我不想透露完整的解決方案,因爲這很可能是一項作業任務。因此,我想看到海報實際上有一些代碼要顯示。 – miensol