HDU 5569 matrix
简单DP
/* *********************************************** Author :Zhou Zhentao Email :774388357@qq.com Created Time :2015/11/21 9:45:58 File Name :acm.cpp ************************************************ */ #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; int mat[1000+10][1000+10]; int flag[1000+10][1000+10]; int dp[1000+10][1000+10]; int n,m; int main() { while(~scanf("%d%d",&n,&m)){ for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",&mat[i][j]); flag[0][0]=1; for(int i=1;i<m;i++) flag[0][i]=abs(1-flag[0][i-1]); for(int i=1;i<n;i++) for(int j=0;j<m;j++) flag[i][j]=abs(1-flag[i-1][j]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(i==0&&j==0) dp[i][j]=0; if(i==0) { if(flag[i][j]==0) { dp[i][j]=dp[i][j-1]+mat[i][j]*mat[i][j-1]; } else { dp[i][j]=dp[i][j-1]; } } else if(j==0) { if(flag[i][j]==0) { dp[i][j]=dp[i-1][j]+mat[i][j]*mat[i-1][j]; } else { dp[i][j]=dp[i-1][j]; } } else { if(flag[i][j]==0) { dp[i][j]=min(dp[i][j-1]+mat[i][j]*mat[i][j-1],dp[i-1][j]+mat[i][j]*mat[i-1][j]); } else { dp[i][j]=min(dp[i][j-1],dp[i-1][j]); } } } } printf("%d\n",dp[n-1][m-1]); } return 0; }