题目:AcWing 3326.最大硬币数

Mike 有一个 N 行 N 列的方格矩阵。

位于第 i 行第 j 列的方格的位置坐标表示为 (i,j)。矩阵左上角方格的坐标即为 (1,1)。每个方格中都包含一定数量的硬币,Mike 只有到达一个方格内时,方可收集方格中的硬币。Ci,j 表示第 i 行第 j 列的方格中的硬币数量。

当 Mike 处于方格 (i,j) 时,他可以选择移动至方格 (i−1,j−1) 或方格 (i+1,j+1) 中,前提是所选择的方格位于矩阵边界内,且之前没有到达过。

Mike 可以选择从任意方格开始移动,也可以选择在移动至任意方格时结束移动。Mike 希望尽可能多的收集硬币。

请帮助他确定他可以收集的最大硬币数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
using namespace std;
const int N=1010;

long long c[N][N];

long long n;
long long getans(int a,int b)
{
long long max=0;
while(a<=n&&b<=n)
{
max+=c[a][b];
a++,b++;
}
return max;
}

int main()
{
int T;
cin>>T;
for(int t=1;t<=T;t++)
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&c[i][j]);

long long ans = 0;
for(int i=1;i<=n;i++)
ans=max(ans,getans(i,1));

for(int i=1;i<=n;i++)
ans=max(ans,getans(1,i));

printf("Case #%d: %lld\n", t, ans);
}


return 0;
}