PKU 1191

    技术2022-05-19  26

    #include <iostream> #include <cmath> using namespace std; const int inf = 1000000000; const int maxs = 9; const int maxn = 15; int n; int mat[maxs][maxs]; int dp[maxn][maxs][maxs][maxs][maxs]; void solve() { int k, f, x1, y1, x2, y2; for (x1 = 1; x1 <= 8; x1++) { for (y1 = 1; y1 <= 8; y1++) { for (x2 = x1; x2 <= 8; x2++) { for (y2 = y1; y2 <= 8; y2++) { int tmp = mat[x2][y2] - mat[x1-1][y2] - mat[x2][y1-1] + mat[x1-1][y1-1]; dp[0][x1][y1][x2][y2] = tmp * tmp; } } } } for (k = 1; k < n; k++) { for (x1 = 1; x1 <= 8; x1++) { for (y1 = 1; y1 <= 8; y1++) { for (x2 = x1; x2 <= 8; x2++) { for (y2 = y1; y2 <= 8; y2++) { dp[k][x1][y1][x2][y2] = inf; for (f = x1; f < x2; f++) { int tmp = min(dp[k-1][x1][y1][f][y2] + dp[0][f+1][y1][x2][y2], dp[0][x1][y1][f][y2] + dp[k-1][f+1][y1][x2][y2]); if (tmp < dp[k][x1][y1][x2][y2]) dp[k][x1][y1][x2][y2] = tmp; } for (f = y1; f < y2; f++) { int tmp = min(dp[k-1][x1][y1][x2][f] + dp[0][x1][f+1][x2][y2], dp[0][x1][y1][x2][f] + dp[k-1][x1][f+1][x2][y2]); if (tmp < dp[k][x1][y1][x2][y2]) dp[k][x1][y1][x2][y2] = tmp; } } } } } } } int main() { int i, j; scanf("%d", &n); memset(mat, 0, sizeof(mat)); memset(dp, 0, sizeof(dp)); for (i = 1; i <= 8; i++) { for (j = 1; j <= 8; j++) { scanf("%d", &mat[i][j]); mat[i][j] = mat[i][j] + mat[i-1][j] + mat[i][j-1] - mat[i-1][j-1]; } } double ave = 1.0 * mat[8][8] / n; solve(); printf("%.3lf/n", sqrt(1.0 * dp[n-1][1][1][8][8] / n - ave * ave)); return 0; }

     

    最新回复(0)