動態規劃練習題-19(最低通行費)
阿新 • • 發佈:2019-02-02
一個商人穿過一個 N*N 的正方形的網格,去參加一個非常重要的商務活動。他要從網格的左上角進,右下角出。每穿越中間1個小方格,都要花費1個單位時間。商人必須在(2N-1)個單位時間穿越出去。而在經過中間的每個小方格時,都需要繳納一定的費用。
這個商人期望在規定時間內用最少費用穿越出去。請問至少需要多少費用?
注意:不能對角穿越各個小方格(即,只能向上下左右四個方向移動且不能離開網格)。
先看題目只能走(2n-1)步,不難看出只能向右和向下走,故設f[i][j]為到達(i,j)位上最省錢的花錢數,因只能向下與向右,故不難推出f[i][j]=min(f[i][j-1]+f[i-1][j])+a[i][j]。細節請看下面。
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
long long a[101][101],f[101][101],n;
memset(a,0,sizeof(a));
memset(f,9999,sizeof(f));//因為求最少花錢所以要定義初始化大一些
cin>>n;
for(int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==1&&j==1){f[1][1]=a[1][1];}//將f[1][1]初始化,因為此店上面與左邊是9999,故一定初始化此點
else{f[i][j]=a[i][j]+min(f[i][j-1],f[i-1][ j]);}
}
}
cout<<f[n][n];
}