機器人硬幣收集問題機器人硬幣收集 - 動態規劃
若干硬幣被放置在
n × m
板的細胞,無細胞每超過 一個硬幣。位於 紙板左上角的機器人需要收集儘可能多的硬幣,並將 帶到右下角的單元格。在每一步中,機器人都可以將一個單元移動到右側,也可以從當前位置向下移動一個單元。當機器人用一枚硬幣來訪問一個單元格時,它總是拿起那枚硬幣。 設計一種算法來查找機器人可以收集的最大硬幣數量以及它需要遵循的路徑。如果電路板上的某些單元不可用於 機器人,您將如何修改硬幣的動態編程算法 收集問題?將你的算法應用到下面的板上,其中不可訪問的 單元由X顯示。這塊 板有多少條最佳路徑?
我編碼上述圖像,並且它的工作原理以及輸出顯示4.不可訪問單元被標記爲-1。但是,我使a[0][1]=1
可訪問,我得到一個奇怪的問題,其中顯示a[1][0]=3
初始化後,輸出是6而不是5.如何顯示單元格a[1][0]
而不是1?無論我在a[0][1]
更改哪些內容受到影響,我都會受到影響a[1][0]
。那個怎麼樣?我哪裏錯了?
#include <stdio.h>
int max(int a,int b)
{
return a>b?a:b;
}
int robot_coin_collect(int m,int n,int a[][n])
{
int i=1,j=1,k,c[m][n];
c[0][0]=a[0][0];
while(a[i][0]!=-1)
{
c[i][0]=c[i-1][0]+a[i][0];
i=i+1;
}
for(;i<m;i++)
c[i][0]=-6;
while(a[0][j]!=-1)
{
c[0][j]=c[0][j-1]+a[0][j];
j=j+1;
}
for(;j<n;j++)
c[0][j]=-6;
display(m,n,c); // after initialising
printf("\n\n");
for(i=1;i<m;i++)
{
for(j=1;j<n;j++)
{
if(a[i][j]!=-1)
c[i][j]=max(c[i-1][j],c[i][j-1])+a[i][j];
else
c[i][j]=-6;
}
}
display(m,n,c); // after the algorithm finishes, result
return c[m-1][n-1];
}
void display(int m,int n,int c[][n])
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d\t",c[i][j]);
printf("\n");
}
}
int main(void)
{
int a[5][6]={0,1,0,1,0,0,
1,0,0,-1,1,0,
0,1,0,-1,1,0,
0,0,0,1,0,1,
-1,-1,-1,0,1,0};
printf("%d",robot_coin_collect(5,6,a));
return 0;
}
而(A [0] [j]的!= - 1) { C [0] [j] = C [0] [j-1] + A [0] [j ]。 j = j + 1; } 當您使其可訪問時,[0] [1]不是-1, 增加極限界限條件 – mojtaba357
極限界限條件?像什麼?我的意思是爲什麼'a [1] [0]'變化,對於在'a [0] [1]'處更改的值? –
limit bound like: while(i
mojtaba357