説明
HBはビザをしたい、許可証が1..Nの番号が付けられ、各フロアにM、N事務所の層を構築し、各オフィスはスタッフのビザを持っているということです、ビザは、M層のメンバーにビザを取得する必要があります有効であるためにシール。各メンバーは、三つの条件がHBスタンプを与える次ビザのいずれかを満たしている必要があります。
- 一階のビザのスタッフ。
- HBビザは、章のこの正階下ビザのメンバー(同じ部屋番号)ビザ影メンバーを与えています。
- HBビザは、隣接する部屋(同じ階の部屋番号1の差)は、このビザのメンバー章のビザ影メンバーを与えています。
料金を請求されますビザスタンプの各メンバーは、この手数料は10億以上ではありません。スタンプラインの最小コスト、ビザの発効を探します。
入力
第1行两个整数 M 和 N 。 接下来M行每行 N 个整数,第i行第j个数表示第i层的第j个签证员收取的费用。
出力
出力の最小コスト。
サンプル入力1
3 4
10 10 1 10
2 2 2 10
1 10 10 10
サンプル出力1
8
ヒント
1 <= M <= 100,1 <= N <= 500
非常に単純な一見、ちょうどi番目の必要なj番目の部屋の層、伝達方程式への最小コスト表す関数F(i、j)の状態を設定します
。(F(Iを\(F(i、j)は=分の1- 、J)、(I、F
、J-1)、F(I、J + 1))+ [I] [j]は\) 現在の部屋のためにここで、[I] [j]をとります。
初期化
\(F(I、J)= INF \)
\(F(1、J)は= [J] [1] | 1 <= J <= M \)
各層はそう転送する場合は、右または右から左のいずれかから計算計算するために左に後の効果を有する更新左右の場合、そうF(i、j)はFを(計算するために使用されるので、 I、J + 1)が更新されていない、それはエラーが発生します
溶液をf(i、j + 1)の更新Fで左から右へ、次いで下の層を仕上げるF(I、J-1)で開始各層すぐ更新F(i、j)は放置します(i、j)は、番号が不明の計算に使用されていないことを確実にします。
\(ANS =分(F(
N、j)は| 1 <= jの<= M)\) Iコード、現在の差分を下ることです
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int a[105][505];
int f[105][505];
void init(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<=n+1;i++)
for(int j=0;j<=m+1;j++)
f[i][j]=inf;
}
void dp(){
for(int i=1;i<=m;i++)f[n][i]=a[n][i];
for(int i=n-1;i>=1;i--){
for(int j=m;j>=1;j--)
f[i][j]=min(f[i+1][j],f[i][j+1])+a[i][j];//合并右走和下走
for(int j=1;j<=m;j++)//分开循环防后效
f[i][j]=min(f[i][j],f[i][j-1]+a[i][j]);//左走
}
int ans=inf;
for(int i=1;i<=m;i++)
ans=min(ans,f[1][i]);
printf("%d",ans);
}
int main(){
init();
dp();
return 0;
}