题目链接
题意:从(1,1)到(n,m)每次只能往右边或者下边,费用是a1*a2+a3 * a4…..,
解法:画图可以发现,用点计算边权,点坐标和是奇数,的从上一个状态转移来是要加边权,否则是不用的
dp[i][j]:表示到点(i,j)的最小花费
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define cl(a,b) memset(a,0,sizeof(a))
#define LL long long
const int maxn=1005;
LL a[maxn][maxn];
LL dp[maxn][maxn];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%lld",&a[i][j]);
}
}
for(int i=0;i<maxn;i++)for(int j=0;j<=maxn;j++){
dp[i][j]=1LL<<58;
}
dp[1][1]=0;
for(int i=1;i<=n;i++){
for(int j=1+(i==1);j<=m;j++){
if((i+j)%2==0)
dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
else
dp[i][j]=min(dp[i-1][j]+a[i-1][j]*a[i][j],dp[i][j-1]+a[i][j-1]*a[i][j]);
//printf("dp[%d][%d] = %d\n",i,j,dp[i][j]);
}
}
printf("%lld\n",dp[n][m]);
}
return 0;
}