post1287:最低通行费


1
2
3
4
5
6
7
8
9
10
11
先找最后一步,设右下角坐标为,n,m
要走到n,m必须先走左边,或者右边
可得f[n][m]=min{f[n-1][m],f[n][m-1]}+a[i][j]
其中f[n][m]表示走到n,m所需的最小费用
于是问题从 求f[n][m]缩小到求 f[n-1][m]和f[n][m-1]
可的转移方程为:f[i][j]=min{f[i-1][j],f[i][j-1]}+a[i][j]
确定边界:
当i==0或j==0时减一可能为负所以先对他们进行初始化
计算顺序:
要得到 f[i][j]必须先得到 f[i-1][j]和f[i][j-1]
由于时间为2N-1所以只走右下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>  
#include <algorithm>
using namespace std;
int main(){
int n;
int a[205][205];
int f[205][205];
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];

f[0][0]=a[0][0];
for(int j=1;j<n;j++){
f[0][j]=f[0][j-1]+a[0][j];//初始化第一行
}
for(int j=1;j<n;j++){
f[j][0]=f[j-1][0]+a[j][0];//初始化第一列
}
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
f[i][j]=min(f[i-1][j],f[i][j-1])+a[i][j];
}
}
cout<<f[n-1][n-1]<<endl;
}

文章作者: 澣云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 澣云 !
  目录