CF1219G Harvester 题解
(从luogu上搬过来了!)
个人感觉这题在绿题范围
题面描述
n * m的网格中,在第i行j列有a[i][j]个泡泡,每次可以收割一行或一列的泡泡,最多可以收割4次,问最多可以收割到多少泡泡。
分析
1.错误的想法①
拿到题面,我首先的思路是一个简易的模拟:
直接读入二维数组,首先用前缀和统计每一行和每一列的总和
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=m;j++)
{
cin>>a[i][j];
xx[i]+=a[i][j];
yy[j]+=a[i][j];
}
}
再在行和列中找到当前收割走此行/列后可以得到最多泡泡的行/列,每次收割走就把它会影响到的行/列处理一下
具体例子如第二个样例
5 5
0 9 2 7 0
9 0 3 0 5
0 8 0 3 1
6 7 4 3 9
3 6 4 1 0
第一次我们拿了第四行(xx[4]),所以要把所有列的前缀和都减去a[4][j],以防重复添加。
然后再重复四次。
提交后,惊奇地发现,第四个点就WA了,why?
这种想法很显然是错误的,当我们发现某行取走能得到当前的最大值,然后取了这行之后会把所有列都减小,但是有可能此时取要多个列更优。即这种模拟做法可能会失去最大的结果
2.错误的想法②
既然会失去某些结果,那要不就在上一种代码的思路上dfs把所有能取的方法走一遍
但是,显而易见这种 的复杂度会炸掉(提交后第4个点就TLE了)
3.正解
那么这条路看起来已经走到头了,所以正解要怎么搞!?
不妨换一种思路,既然只有四次取泡泡的机会,那取的方案应该只有5种:
1