1. 程式人生 > >動態規劃練習題-19(最低通行費)

動態規劃練習題-19(最低通行費)

一個商人穿過一個 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]; }