hdu 5569

题意:一个矩阵,从(1,1)走到(n,m),只能右,下,问最短路径和最短,路径和为走过的点a1*a2+a2*a3+.....

思路:暴力转移即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1002;

int a[N][N];
ll dp[N][N];
int n,m;

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        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;i++)
            for(int j=0;j<=m;j++) dp[i][j]=1e18;
        dp[1][0]=0;dp[0][1]=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
               if(i>1&&j>1){
                    dp[i][j]=min(dp[i][j],dp[i-1][j-1]+min(a[i][j]*a[i-1][j],a[i][j-1]*a[i][j]));
               }
               if(i>1) dp[i][j]=min(dp[i][j],dp[i-2][j]+a[i-1][j]*a[i][j]);
               if(j>1) dp[i][j]=min(dp[i][j],dp[i][j-2]+a[i][j-1]*a[i][j]);

            }
        }
        cout<<dp[n][m]<<endl;
    }
    return 0;
}

 

posted on 2017-08-11 16:15  hhhhx  阅读(109)  评论(0编辑  收藏  举报

导航