hdu 5569

                                                           matrix


Problem Description
Given a matrix with n rows and m columns ( n+m 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 a1,a2,...,a2k . The cost is a1a2+a3a4+...+a2k1a2k . What is the minimum of the cost?
 

Input
Several test cases(about 5 )

For each cases, first come 2 integers, n,m(1n1000,1m1000)

N+m is an odd number.

Then follows n lines with m numbers ai,j(1ai100)
 

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

题意:给定n和m,n为行数,m为列数,让我们从(1,1)走到(n,m),其中走奇数步时,运算的是该项的值和后一项的乘积,走偶数步时,运算的是该项的值和后一项的和,让我们求出到达终点时,我们求出的值最小

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int a[1003][1003],dp[1003][1003];
int n,m;
int min(int a,int b)
{
    return a>b?b:a;
}
int main()
{
    int i,j,sum;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        memset(dp,1,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                sum=i+j;
                if(sum%2!=0)
                {
                    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]);//当i+j为奇数时,前面走过的步数为奇数,所以它有可能是从上面过来,也可能是从左边过来

               }else{
                    dp[i][j]=min(dp[i-1][j],dp[i][j-1]);//当i+j为偶数时,前面走过的步数为偶数,此时我们求的值还没有变化
                }
                if(i==1 && j==1)
                {
                    dp[i][j]=0;//在最开始的点,还未运动,所以dp[i][j]=0
                }
            }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值