Acwing1018.最小通行费

98 阅读1分钟

1018. 最低通行费 - AcWing
分析思路同摘花生,不能回头

然后利用动态规划的思路解决题目。

C++代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110,INF=1e9;
int w[N][N];
int f[N][N];
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>w[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==1&&j==1){
                f[i][j]=w[i][j];
            }
            else {
                f[i][j]=INF;
                if(i>1)f[i][j]=min(f[i][j],f[i-1][j]+w[i][j]);
                if(j>1)f[i][j]=min(f[i][j],f[i][j-1]+w[i][j]);
            }
        }
    }
    cout<<f[n][n];
    return 0;
}

Go代码

package main

import (
   "bufio"
   "fmt"
   "os"
)

func min(a, b int) int {
   if a < b {
      return a
   }
   return b
}

const N = 110
const INF = 1e9

var f, w [N][N]int
var in = bufio.NewReader(os.Stdin)
var out = bufio.NewWriter(os.Stdout)
var n int

func main() {
   defer out.Flush()
   fmt.Fscan(in, &n)
   for i := 1; i <= n; i++ {
      for j := 1; j <= n; j++ {
         fmt.Fscan(in, &w[i][j])
      }
   }
   for i := 1; i <= n; i++ {
      for j := 1; j <= n; j++ {
         f[i][j] = INF
         if i == 1 && j == 1 {
            f[i][j] = w[i][j]
         }
         if i > 1 {
            f[i][j] = min(f[i][j], f[i-1][j]+w[i][j])
         }
         if j > 1 {
            f[i][j] = min(f[i][j], f[i][j-1]+w[i][j])
         }
      }
   }
   fmt.Fprintln(out, f[n][n])
}