题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5569
简单dp,恶心的边界处理,无语;
if((i+j)%2==1)
dp[i][j]=a[i-1][j]*a[i][j]+min(dp[i-2][j], dp[i-1][j-1]);
dp[i][j]=min(dp[i][j], a[i][j-1]*a[i][j]+min(dp[i-1][j-1], dp[i][j-2]));
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<map> #include<cmath> #include<queue> using namespace std; #define N 1005 #define INF 0x3f3f3f3f int a[N][N],dp[N][N], m, n; int main() { while(scanf("%d %d", &m, &n)!=EOF) { for(int i=0; i<N; i++) for(int j=0; j<N; j++) dp[i][j]=INF; for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) scanf("%d", &a[i][j]); dp[1][1]=0; dp[1][2]=a[1][1]*a[1][2]; dp[2][1]=a[1][1]*a[2][1]; for(int i=3; i<=m; i++) { dp[i][1]=dp[i-2][1]+a[i][1]*a[i-1][1]; dp[i][2]=min(a[i][1]*a[i][2]+dp[i-1][1],a[i-1][2]*a[i][2]+min(dp[i-1][1], dp[i-2][2])); } for(int i=3; i<=n; i++) { dp[1][i]=dp[1][i-2]+a[1][i]*a[1][i-1]; dp[2][i]=min(a[1][i]*a[2][i]+dp[1][i-1],a[2][i-1]*a[2][i]+min(dp[1][i-1], dp[2][i-2])); } for(int i=3; i<=m; i++) { for(int j=3; j<=n; j++) { if((i+j)%2==1) { dp[i][j]=a[i-1][j]*a[i][j]+min(dp[i-2][j], dp[i-1][j-1]); dp[i][j]=min(dp[i][j], a[i][j-1]*a[i][j]+min(dp[i-1][j-1], dp[i][j-2])); } } } printf("%d ", dp[m][n]); } return 0; } /* 3 4 1 2 3 7 4 5 6 8 10 11 12 9 92 */