Portal de temas
Pregunta: Si le da un tablero de ajedrez, puede cortar un cuchillo en la parte restante del tablero de ajedrez cada vez y asegúrese de que la parte restante después de cortar siga siendo un rectángulo. Ahora vamos a usar esta regla para cortar este tablero de ajedrez en n piezas. La puntuación de cada pieza es la suma de los números representados por cada cuadrado pequeño en esta pieza. Ahora queremos que encuentres el error cuadrático medio más pequeño de estas n piezas (desviación estándar).
Idea: Podemos calcular σ 2 = 1 / n ∑ xi 2 - x ′ 2 (x ′ representa el número promedio) σ ^ 2 = 1 / n \ sum x_i ^ 2-x '^ 2 (x' representa el número promedio )σ2=1 / n∑XI2-X′ 2 (x'La tablamuestra elnúmeropromedioplano), entonces podemos usarf [k] [x 1]f [ k ] [ x 1 ] [ y 1 ] [ x 2 ] [ y 2 ] significa(x 1, y 1) (x1, y1)( x 1 ,y 1 ) es la esquina superior izquierda,(x 2, y 2) (x2, y2)( x 2 ,y 2 ) es el rectángulo en la esquina inferior derecha, cortado k veces, el más pequeño∑ xi 2 \ sum x_i ^ 2∑XI2, Y luego enumerar directamente cada rectángulo, tenemos dos métodos de transferencia: corte horizontal y corte vertical, cada vez que cortas las dos piezas tienes que considerar qué pieza seguir cortando, es decir, cortar k-1 veces. Finalmente, calcule la salida de acuerdo con la fórmula.
Código:
#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
//#define int long long
#define pii pair<int,int>
#define ull unsigned long long
#define pdd pair<double,double>
#define lowbit(x) x&-x
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read()
{
int x=0,f=1;
char ch=gc();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=gc();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=gc();
}
return x*f;
}
using namespace std;
const int N=2e5+55;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-6;
const double PI=acos(-1);
int a[10][10],sum[10][10],f[20][10][10][10][10];
void dfs(int k,int x1,int y1,int x2,int y2)
{
f[k][x1][y1][x2][y2]=inf;
for(int i=x1;i<x2;i++)
{
f[k][x1][y1][x2][y2]=min(f[k][x1][y1][x2][y2],f[k-1][x1][y1][i][y2]+f[0][i+1][y1][x2][y2]);
f[k][x1][y1][x2][y2]=min(f[k][x1][y1][x2][y2],f[0][x1][y1][i][y2]+f[k-1][i+1][y1][x2][y2]);
}
for(int i=y1;i<y2;i++)
{
f[k][x1][y1][x2][y2]=min(f[k][x1][y1][x2][y2],f[k-1][x1][y1][x2][i]+f[0][x1][i+1][x2][y2]);
f[k][x1][y1][x2][y2]=min(f[k][x1][y1][x2][y2],f[0][x1][y1][x2][i]+f[k-1][x1][i+1][x2][y2]);
}
}
void solve()
{
int n;
cin>>n;
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cin>>a[i][j];
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
}
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
for(int p=i;p<=8;p++)
{
for(int q=j;q<=8;q++)
{
int t=sum[p][q]-sum[p][j-1]-sum[i-1][q]+sum[i-1][j-1];
f[0][i][j][p][q]=t*t;
}
}
}
}
for(int k=1;k<=n-1;k++)
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
for(int p=i;p<=8;p++)
for(int q=j;q<=8;q++)
dfs(k,i,j,p,q);
int tot=f[n-1][1][1][8][8];
double avy=sum[8][8]*1.0/n;
double ans=sqrt(1.0*tot/n-avy*avy);
printf("%.3f\n",ans);
}
signed main()
{
solve();
return 0;
}