题意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少。如图,最北边有bloggium的收集站,最西边有 yeyenum 的收集站。现在要你在这些格子上面安装向北或者向西的传送带(每个格子自能装一种)。问最多能采到多少矿(yeyenum+bloggium)?
分析:每个格子只能向西或者向北,某个格子假如被选定向西,那么它所在的这一行全都向西。
代码如下
#include<stdio.h>
#define N 502
int dp[N][N],north[N][N],west[N][N];
int max(int x,int y)
{
return x>y?x:y;
}
void main()
{
int row,col,i,j,ye,bl;
while(scanf("%d%d",&row,&col)!=EOF)
{
if(row==0&&col==0)
break;
memset(west,0,sizeof(west));
memset(north,0,sizeof(north));
memset(dp,0,sizeof(dp));
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
scanf("%d",&ye);
west[i][j]=west[i][j-1]+ye;
}
}
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
scanf("%d",&bl);
north[i][j]=north[i-1][j]+bl;
}
}
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
dp[i][j]=max(west[i][j]+dp[i-1][j],north[i][j]+dp[i][j-1]);
}
}
printf("%d\n",dp[row][col]);
}
}