hdoj--5569--matrix(动态规划) matrix
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 509 Accepted Submission(s): 297
Total Submission(s): 509 Accepted Submission(s): 297
Problem Description
Given a matrix with
rows and
columns (
is an odd number ), at first , you begin with the number at top-left corner (1,1) and you want to go to the number at bottom-right corner (n,m). And you must go right or go down every steps. Let the numbers you go through become an array
.
The cost is .
What is the minimum of the cost?
Input
Several test cases(about
)
For each cases, first come 2 integers,
N+m is an odd number.
Then follows lines with numbers
For each cases, first come 2 integers,
N+m is an odd number.
Then follows lines with numbers
Output
For each cases, please output an integer in a line as the answer.
Sample Input
2 3 1 2 3 2 2 1 2 3 2 2 1 1 2 4
Sample Output
4 8
Source
Recommend
hujie | We have carefully selected several similar problems for you: 5589 5588 5587 5586 5585
用dp数组记录下到达每一个点最小的路径
用dp数组记录下到达每一个点最小的路径
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; long long dp[1010][1010],num[1010][1010]; int m,n; int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(num,0,sizeof(num)); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%lld",&num[i][j]); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(i==1&&j==1) dp[i][j]=0; else if((i+j)&1) { if(i==1) dp[i][j]=dp[i][j-1]+num[i][j-1]*num[i][j]; else if(j==1) dp[i][j]=dp[i-1][j]+num[i-1][j]*num[i][j]; else dp[i][j]=min(dp[i][j-1]+num[i][j-1]*num[i][j],dp[i-1][j]+num[i-1][j]*num[i][j]); } else { if(i==1) dp[i][j]=dp[i][j-1]; else if(j==1) dp[i][j]=dp[i-1][j]; else dp[i][j]=min(dp[i-1][j],dp[i][j-1]); } } } printf("%lld ",dp[n][m]); } return 0; }