题目描述 Description
这天是rabbit 的生日前夕,Xth 来到花店,要给他的rabbit 买玫瑰花,为了保证质
量,他跟花店老板——小菜儿同学要求自己到花田采摘。小菜儿灰常希望早日见到
暖熊(xth 儿子的小名),于是他决定帮忙。
小菜儿告诉xth,花田是一个n ∗ m的矩形区域,里面有红玫瑰和黑玫瑰两种玫瑰。
Xth 探明了每一块小区域内红玫瑰和黑玫瑰的种植量,并且还在花田的北边和西边
分别设置了红玫瑰和黑玫瑰的收集站(地图上上北下南左西右东)。你的任务是设
计一个运输线系统,使得运送的红玫瑰和黑玫瑰的总量最多。
运输线有两种,一种是东西向,一种是南北向。在一个格子内你能建造一种运输线,
但不能两种都建。如果两个同类型运输线首尾相接,它们就可以被连接起来。
另外,这些玫瑰都十分不稳定,因此它们在运送过程中都不能拐弯。这就意味着如
果某个格子上建有南北向运输线,但是它北边的格子建有东西向运输线。那么这条
南北向运输线内运送的任何东西都将丢失。进一步地,运到红玫瑰收集点的黑玫瑰
会丢失,运到黑玫瑰收集点的红玫瑰也会丢失。
输入描述 Input Description
第一行包含两个整数n和m,表示花田大小。 以下n行,每行m个整数,其中第i行
第j个整数g[ i ,j ] 描述各个格子上的黑玫瑰数量。接下来以类似的矩阵表示各个格
子上的红玫瑰数量。
输出描述 Output Description
仅一个整数, 表示最多可以采集到的红玫瑰和黑玫瑰的总量。
样例输入 Sample Input
4 4
0 0 10 9
1 3 10 0
4 2 1 3
1 1 20 0
10 0 0 0
1 1 1 30
0 0 5 5
5 10 10 10
样例输出 Sample Output
98
数据范围及提示 Data Size & Hint
对于30%的数据: 0 ≤ n, m ≤ 100;
对于100%的数据: 0 ≤ n,m ≤ 1000;
0 ≤ g[ i,j ] ≤ 1000.
分类标签 Tags 点此展开
题解:
由题意可知,对于每一个点(i,j)只能往上走 或 往左走
所以就可以搞了。
R[i][j]表示第j列前i行的红玫瑰数量之和
B[i][j]表示第i行前j列的黑玫瑰数量之和
(求其他前缀和没有意义)
f[i][j]表示(1,1)->(i,j)这个矩形中的红玫瑰数量+黑玫瑰数量的最大值
自行初始化。
转移方程:
f[i][j]=max(f[i-1][j]+B[i][j],f[i][j-1]+R[i][j]);
ans:f[n][m]
时间复杂度:O(n*m)
AC代码:
#include<cstdio> #include<algorithm> using namespace std; const int N=1003; inline const int read(){ register int x=0,f=1; register char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int B[N][N],R[N][N],f[N][N]; int main(){ int n=read(),m=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ B[i][j]=read(),B[i][j]+=B[i][j-1]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ R[i][j]=read(),R[i][j]+=R[i-1][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ f[i][j]=max(f[i-1][j]+B[i][j],f[i][j-1]+R[i][j]); } } printf("%d ",f[n][m]); return 0; }