优化算法
查看原帖
优化算法
1362218
gujiale123楼主2024/5/23 17:25

虽然这题垃圾可以使用暴力解法,但实际上这个暴力也是可以大幅度优化的.原解法需要对共36个格子嵌套,即36层嵌套,实际上我们注意到在一个正方形的四个格子里要么全都不取,要么只能取一个(四种可能),共五种可能.那么我们就可以把原图分割为数个正方形,每次函数迭代就可以处理四个格子,最大进行32/4=8次嵌套.比原来的32次嵌套强了非常多.#include<bits/stdc++.h>

using namespace std;int b[10][10];
int a[10][10],n,m,t;
void f0(int x0,int y0,int c) {
    for(int x=max(x0-1,1);x<=min(x0+1,n);x++)
for(int y=max(y0-1,1);y<=min(y0+1,m);y++)b[x][y]+=c;
}
int f(int x0,int y0) {
if(x0>n){x0=1;y0+=2;}
if(y0>m)return 0;
int s=f(x0+2,y0);
for(int x=x0;x<=min(x0+1,n);x++)
for(int y=y0;y<=min(y0+1,m);y++) {
  if(b[x][y]==0){f0(x,y,1);;s=max(s,f(x0+2,y0)+a[x][y]);f0(x,y,-1);}
}
return s;
}
int main()
{
    cin>>t;
  while (t-->0) {
      cin>>n>>m;
      for(int i=1;i<=n;i++)
      for(int h=1;h<=m;h++){cin>>a[i][h];b[i][h]=0;}
      cout<<f(1,1)<<endl;
  }
    return 0;
}
2024/5/23 17:25
加载中...