Boundary
思路:枚举每两个点,算出圆心的坐标,比较得到圆心出现最多的次数即可,当两点斜率相同说明这两点一定不在同一圆上。

#include<iostream>
using namespace std;
#include<map>
#include<algorithm>
double x[2010],y[2010];
map<pair<double,double>,int>mp;
int ans=0;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
       scanf("%lf%lf",&x[i],&y[i]);
    for(int i=0;i<n;i++)
    {
        mp.clear();
        for(int j=i+1;j<n;j++)
        {
            if(x[i]*y[j]==x[j]*y[i]) continue;
            double xx = ((y[j]-y[i])*y[i]*y[j]-x[i]*x[i]*y[j]+x[j]*x[j]*y[i])/(x[j]*y[i]-x[i]*y[j]);
            double yy = ((x[j]-x[i])*x[i]*x[j]-y[i]*y[i]*x[j]+y[j]*y[j]*x[i])/(y[j]*x[i]-y[i]*x[j]);
            mp[{xx,yy}]++;
            ans=max(ans,mp[{xx,yy}]);
        }
    }
    printf("%d",ans+1);
    return 0;
}

Fake Maxpooling
思路:易证从i=1,j=1开始,每个kxk子矩阵的最大数一定大于等于前一个子矩阵,距此每次将矩阵的的数与上一行,上一列的数进行比较,取出最大数相加即可。

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 5010;
int dp[5010][5010] = { 0 };
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int m, n, k;
    long long ans=0;
    scanf("%d%d%d",&n,&m,&k);
 for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(!dp[i][j])
            {dp[i][j]=i*j/gcd(i,j);
             dp[j][i]=dp[i][j];
            }
   for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(k!=1)    dp[i][j]=max({dp[i][j],dp[i-1][j],dp[i][j-1]});
            if(i>=k&&j>=k) {ans+=dp[i][j];
                           }
                           }
    printf("%lld",ans);
    return 0;
}