RT,是写错了还是爆精度了 代码如下
//acwing321
#include <bits/stdc++.h>
#define double long double
using namespace std;
const int N = 10;
double dp[N][N][N][N][17];
int n, s[N][N];
double calc(int l1, int r1, int l2, int r2){
double sum = s[l2][r2] - s[l1-1][r2] - s[l2][r1-1] + s[l1-1][r1-1] - s[8][8] / n;
return sum * sum;
}
double dfs(int l1, int r1, int l2, int r2, int k){
double &now = dp[l1][r1][l2][r2][k];
if(now >= 0) return now;
if(k == 1) return now = calc(l1, r1, l2, r2);
now = 1e9;
for(int i = l1; i < l2; ++ i){
now = min(now, dfs(l1, r1, i, r2, k-1) + dfs(i+1, r1, l2, r2, 1));
now = min(now, dfs(l1, r1, i, r2, 1) + dfs(i+1, r1, l2, r2, k-1));
}
for(int i = r1; i < r2; ++ i){
now = min(now, dfs(l1, r1, l2, i, k-1) + dfs(l1, i+1, l2, r2, 1));
now = min(now, dfs(l1, r1, l2, i, 1) + dfs(l1, i+1, l2, r2, k-1));
}
return now;
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= 8; ++ i){
for(int j = 1; j <= 8; ++ j){
scanf("%d", &s[i][j]);
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + s[i][j];
}
}
memset(dp, -1, sizeof(dp));
printf("%.3Lf", sqrt(dfs(1, 1, 8, 8, n) / n) + 0.0005);
return 0;
}