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])
}