matrix
For each cases, first come 2 integers, n,m(1≤n≤1000,1≤m≤1000)
N+m is an odd number.
Then follows n lines with m numbers ai,j(1≤ai≤100)
2 3 1 2 3 2 2 1 2 3 2 2 1 1 2 4
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;
}