Description
ztxz16如愿成为码农之后,整天的生活除了写程序还是写程序,十分苦逼。终于有一天,他意识到自己的生活太过平淡,于是决定外出旅游丰富阅历。
ztxz16生活的城市有N*M个景点,可以描述成一个N * M的矩形,每个景点有一个坐标(x, y) (1 <= x <= N, 1 <= y <= M)以及美观度A[x][y]和观赏所需的时间B[x][y],从一个景点(x1, y1)走到另一个景点(x2, y2)需要时间为它们之间的曼哈顿距离:|x1 - x2| +|y1 - y2|。
为了防止审美疲劳,ztxz16希望观赏的景点的的美观度是严格上升的,由于不想太早回家码代码,ztxz16希望旅游的总时间尽可能长。
Input
第一行输入两个整数N, M;
接下来N行每行M个整数,第x行第y个整数代表A[x][y];
接下来N行每行M个整数,第x行第y个整数代表B[x][y];
注意,有一些A[x][y]=B[x][y]=0,说明这个景点已经拆除,不能游览;
Output
输出一行代表最长的总时间。
Sample Input
4 5
1 2 6 0 2
1 3 4 0 4
0 0 4 0 3
2 2 0 0 4
1 3 5 0 2
2 8 1 0 2
0 0 3 0 4
0 5 0 0 3
Sample Output
39
【样例说明】
游览顺序为(2,1)->(1,5)->(2,2)->(4,5)->(1,3)
Data Constraint
对于30%的数据:1<=N<=50 , 1<=M<=50
对于60%的数据:1<=N<=300 , 1<=M<=300
对于100%的数据:1<=N<=1000 , 1<=M<=1000
0<=A[x][y]<=1000000
0<=B[x][y]<=10^9
注意:本题输入数据较大,请注意输入消耗的时间
.
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,b[1010][1010],cnt=0;
long long f[1000010],ans=-2147483647;
struct edge
{
int x,y,z;
}a[1000010];
bool cmp(edge x,edge y)
{
return x.z<y.z;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
scanf("%d",&b[i][j]);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
int x;
scanf("%d",&x);
if (x==0&&b[i][j]==0) continue;
cnt++;
a[cnt].z=b[i][j];
a[cnt].x=i;
a[cnt].y=j;
b[i][j]=x;
}
sort(a+1,a+cnt+1,cmp);
int x=1,y=0,x1=1;
f[1]=b[a[1].x][a[1].y];
for (int i=2;i<=cnt;i++)
{
if (a[i].z!=a[i-1].z)
{
x=x1;
y=i-1;
x1=i;
}
for (int j=x;j<=y;j++)
f[i]=max(f[i],f[j]+abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y));
f[i]+=b[a[i].x][a[i].y];
ans=max(ans,f[i]);
}
printf("%lld",ans);
return 0;
}